关于 impala 使用方法的一些测试,包括加载数据、查看数据库、聚合关联查询、子查询等等。
以下测试以 impala 用户来运行:
准备一些测试数据,tab1.csv 文件内容如下:
tab1.csv 文件内容如下:
将这两个表上传到 hdfs:
在 impala 中建表,建表语句如下:
其中 tab1 和 tab2 都是外部表,tab3 是内部表。
将上面 sql 保存在 init.sql 语句,然后运行下面命令进行创建表:
也可以进入到 impala-shell 命令行模式,直接运行 sql 语句。
查看所有数据库:
查看默认数据库下的所有表:
查看 tab1 表结构:
使用 impala-shell 进入命令行交互模式:
传入一个文件:
执行指定的 sql:
导入数据:
准备数据
创建表
加数据导入到创建的表
查询数据:
带 offset 语句查询
带 offset 语句查询,需要和 order by 一起使用,起始编号从 0 开始往后偏移,offset 为 0 时,其结果和去掉 offset 的 limit 结果一致。
测试如下:
以上 sql 语句等同于下面语句,用法同样适用于多个字段:
由上可以看到左边表 tab1 的记录都查询出来了,右边表 tab2 只查询出跟 tab1 关联的记录。
以上语句可以修改为:
查询结果为:
如果去掉 where 语句,会提示错误:
impala 允许自连接,例如:
为了避免产生大量的结果集,impala 不允许下面形式的笛卡尔连接:
如果,你的确想使用笛卡尔连接,建议使用 cross join:
默认地,impala的两表连接需要一个等值的比较,或者使用 on、using、where 语句。在impala 1.2.2 之后,非等值连接也支持。同样需要避免因为产生大量的结果集而造成内存溢出。一旦你想使用非等值连接,建议使用 cross 连接并增加额外的 where 语句。
查询出来的结果会有一些重复的记录,这个时候可以通过 distinct 去重。
左半连接是为了实现 in 语句,左边的记录会查询出来,而不管右边表有多少匹配的记录。impala 2.0版本之后,支持右半连接。
impala 不支持 natural join 操作,以避免产生不一致或者大量的结果。自然连接不适应 on 和 using 语句,而是自动的关联所有列相同值的记录。这种连接是不建议的,特别是当表结构发生变化的时候,如添加或者删除列的时候,会产生不一样的结果集。
impala 2.0 / cdh 5.2 以上版本中支持反连接,包括左反连接和右反连接。左反连接的意思是返回左边表不在右边表中的记录。
找出 tab2 的 id 不在 tab1 中的记录:
聚合关联查询:
聚合关联子查询:
impala 2版本中,支持where 条件子查询,包括 in 、exists 和比较符的子查询:
插入查询:
这时候查询 tab3 的记录: