首页 理论教育 Hive数据查询语言(HQL)简介

Hive数据查询语言(HQL)简介

时间:2023-06-24 理论教育 版权反馈
【摘要】:Hive 数据查询的基本语法为:select 语句“select…from”语句可实现从from 指定的表中查询出select 指定的数据。select em.id,em.name from employee em;4)limit 子句可以通过limit 子句来限定返回的行数。图7.32年龄大于30 或者部门为administration 的用户信息结合like 子句进行查询,可在like 子句中使用通配符“%”和占位符“_”。图7.34like 子句中使用占位符分组语句group by 和havingHive 支持对结果集进行分组。例如,统计employee表中部门人数大于2 的信息,如图7.36 所示。

Hive数据查询语言(HQL)简介

Hive 数据查询的基本语法为:

(1)select 语句

“select…from”语句可实现从from 指定的表中查询出select 指定的数据。

1)全表查询

查询出employee 表的所有数据,结果如图7.28 所示。

图7.28 全表查询

2)选择特定列查询

查询出employee 表的id 和name 两列信息,结果如图7.29 所示。

图7.29 选择特定列查询

3)设置别名

可以为列和表加上别名,尤其在多表联合查询时,别名可以让查询语句的结构更加清晰。例如,给employee 表添加别名为“em”,查询出id 和name 列。

select em.id,em.name from employee em;

4)limit 子句

可以通过limit 子句来限定返回的行数。例如,如果只想获得employee 表的前三条数据,可使用的语句为:

select ∗from employee limit 3;

(2)where 语句

可以使用where 语句来对查询条件进行限制。例如,查询employee 表中年龄大于25 岁的用户信息,如图7.30 所示。

图7.30 年龄大于25 岁的用户信息

结合谓词表达式and,查询employee 表中department 为software 的男性用户,如图7.31所示。

图7.31 department 为software 的男性用户

结合谓词表达式or,查询employee 表中年龄大于30 或者部门为administration 的用户信息,如图7.32 所示。

图7.32 年龄大于30 或者部门为administration 的用户信息

结合like 子句进行查询,可在like 子句中使用通配符“%”和占位符“_”。例如,查询employee表中姓名中含有“yang”这个拼音的用户信息,如图7.33 所示。

图7.33 like 子句中使用通配符

在employee 表的name 字段中使用like 子句的占位符来查询用户信息,如图7.34 所示。

图7.34 like 子句中使用占位符

(3)分组语句group by 和having

Hive 支持对结果集进行分组。group by 语句的作用是按照某些字段分组,有相同字段值的放在一组,其后可以跟having 语句用于对分组进行条件过滤。group by 语句通常与聚合函数联合使用,先按照列值对结果进行分组,再作用聚合函数。

使用group by 语句时,select 语句中的查询字段要么为聚合函数,要么为group by 语句中出现的用于分组的字段,不能是其他值。也就是说,select 中的字段如果不是聚合列,则必须出现在group by 中。

例如,查询employee 表中的每个部门的人数,可以按department 字段分组,并使用聚合函数count()对每组的记录数进行统计,如图7.35 所示。

图7.35 查询employee 表中的每个部门的人数

group by 语句后面可以使用having 子句来对分组结果进行条件过滤。例如,统计employee表中部门人数大于2 的信息,如图7.36 所示。可以使用as 关键字对列或表重命名

图7.36 统计employee 表中部门人数大于2 的信息

注意:having 子句中的元素与group by 一样,要么为聚合函数,要么出现在select 语句中。

(4)order by 语句和sort by 语句进行排序

order by 会对输入数据进行全局排序,只有一个Reducer。因此,当输入规模较大时,使用order by 排序会需要较长的计算时间。

sort by 是对输入数据进行局部排序,并不是全局排序。当设置的Reducer 任务个数大于1时,sort by 会在每个Reducer 任务中分别进行排序,并不保证数据结果全局有序。当Reducer只有1 个时,order by 与sort by 的执行结果相同。

例如,对employee 表按age 进行升序排序。当Reducer 任务个数为1 个时,图7.37 所示为使用order by 排序的情况,图7. 38 所示为sort by 排序的情况。从两张图中可以看出,当Reducer个数为1 时,order by 与sort by 的执行结果相同。

图7.37 Reducer 任务个数为1 时的order by 排序

当Reducer 任务个数大于1 时,比如执行命令“set mapred.reduce.tasks=2;”将Reducer 任务个数设置为2 个。使用order by 排序的情况如图7.39 所示,使用sort by 排序结果如图7.40所示。从两个图中可以看到,Reducer 任务个数大于1 个时,order by 的Reducer 任务个数仍然为1 个,仍然进行全局排序,而sort by 只是局部排序。

图7.38 Reducer 任务个数为1 时的sort by 排序

图7.39 order by 全局排序(www.xing528.com)

图7.40 Reducer 任务个数为2 时的sort by 排序

(5)distribute by 和cluster by 语句

distribute by 会根据它指定的规则将数据分到不同的Reducer 任务,相当于MapReduce 中的分区。distribute by 一般结合sort by 使用,但需写在sort by 子句的前面,也就是先进行分区再进行排序,而且需要事先设置Reduce Task 的个数,使得Reducer 任务个数大于1。例如,使用distribute by 语句对employee 表中的数据按照department 字段进行分区和排序,如图7.41所示。

图7.41 distribute by 语句的使用

cluster by 除了具有distribute by 的功能外,还具有排序的功能,相当于distribute by 和sort by 语句同时使用,cluster by 和sort by 不能同时使用。与distribute by 和sort by 不一样的是,cluster by 语句中用于分区和排序的字段是一样的。例如,对employee 表中的数据按照department 字段进行分区和排序,可使用cluster by 语句实现,如图7.42 所示。

图7.42 cluster by 语句的使用

(6)join 语句

可以使用join 语句实现多表连接查询,也就是两张表“table_left”和“table_right”可以按照on 的条件进行连接,“table_left”中的一条记录和“table_right”中的一条记录组成一个新的记录。其包括:

①inner join:内连接,也称为“等值连接”。只有某个值在“table_left”和“table_right”表中同时存在,才连接。

②left outer join:左外连接。“table_left”表中的值无论是否在“table_right”表中,都输出,table_right 表中的值只有在“table_left”表中才输出。

③right outer join:右外连接。与left outer join 相反,“table_right”表中的所有记录都会输出。

④full outer join:将会输出所有表的所有记录,如果任一表的指定字段没有符合条件的值,就用NULL 值替换。

⑤left semi join:类似exists,是exists 的高效实现。查找“table_left”表中的数据是否在table_right中存在,找出存在的数据。

举例说明,首先创建一张新的表“employee_salary”,用于存放人员的工资信息。

在本地“/home/apache/data/hive/data”目录下新建文件“salary.txt”,内容如下:

将“salary.txt”加载到“employee_salary”表中:

图7.43 显示的是employee 表和“employee_salary”表中的数据。

图7.43 employee 表和employee_salary 表中的数据

以下为使用不同连接方式查询出人员的工资信息。

1)inner join

查询命令为:

查询结果为:

2)left outer join

查询命令为:

查询结果为:

从查询结果可以看出,employee 表中被查询字段的值都输出了,“employee_salary”表中的数据只有在employee 表中的才输出,且不存在的值使用NULL 替换。

3)right outer join

查询命令为:

查询结果为:

4)full outer join

查询命令为:

查询结果为:

5)left semi join

查询命令为:

相当于:

查询结果为:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈