天天看点

Impala查询功能测试1. 准备测试数据2. 查看表结构3. impala-shell 命令4. 导入数据并查询5. join 连接查询6. 聚合查询

关于 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 的记录: