Hive查询语言(HiveQL)

hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。

GROUP BY

按照某些字段的值进行分组,有相同值放到一起

SELECT col1 [,col2] ,count(1),sel_expr(聚合操作)
FROM table
WHERE condition         -->Map端执行
GROUP BY col1 [,col2]   -->Reduce端执行
[HAVING]                -->Reduce端执行

从表中读取数据,执行where条件,以col1列分组,把col1列的内容作为key,其他列值作为value,上传到reduce,在reduce端执行聚合操作和having过滤。

常用聚合操作

  1. count:计数

  • count(*)    所有值不全为NULL时,加1操作
  • count(1)    不管有没有值,只要有这条记录,值就加1
  • count(col)  col列里面的值为null,值不会加1,这个列里面的值不为NULL,才加1

  2. sum:求和 

  sum(可转成数字的值)      返回bigint

  3. avg:求平均值 

  avg(可转成数字的值)     返回double

  4. distinct:去重,不同值个数 

  count(distinct col)

注意 

  • select后面的非聚合列,必须出现在group by中 
  • select后面除了普通列就是一些聚合操作 
  • group by后面也可以跟表达式,比如substr(col)

问题

  • 使用了reduce操作,受限于reduce数量,可以设置reduce参数(set mapred.reduce.tasks=50)
  • 输出文件个数与reduce数相同,文件大小与reduce处理的数据量有关
  • 数据倾斜,优化参数skewindata (set hive.groupby.skewindata=true),会启动一个优化程序,避免数据倾斜

JOIN

  • 两个表m,n之间按照on条件连接,m中的一条记录和n中的一条记录组成一条新记录。
  • join等值连接(内连接),只有某个值在m和n中同时存在时。
  • left outer join左外连接,左边表中的值无论是否在右边表中存在,都输出;右边表中的值,只有在左边表中存在时才输出
  • right outer join和left outer join相反。
  • left semi join类似exists,即查找a表中的数据,是否在b表中存在,找出存在的数据。
SELECT m.col as col1, m.col2 as col2, n.col3 as col3 
FROM (
    SELECT col, col2 FROM testtable1 WHERE ...   (map端执行)
)m  (左表)
[LEFT OUTER |RIGHT OUTER | LEFT SEMI] JOIN (  
    SELECT col, col2 FROM testtable2 WHERE ...
)n   (右表)
ON m.col=n.col
WHERE condition     (reduced端执行)

读取数据执行where条件,按col列分组,把col列的内容作为key,其他列作为value,传到reduce,在reduce端执行连接操作和where过滤。

MAPJOIN

map side join,在map端把小表加载到内存中,然后读取大表,和内存中的小表完成连接操作,使用了分布式缓存技术。

从大表读取数据,执行where条件。把小表加载到内存中,每读取大表中的一条数据,都要和内存中的小表数据进行比较。

有两种设置方式

1.自动方式

set hive.auto.convert.join=true;
hive.mapjoin.smalltable.filesize默认值是25mb
hive自动根据sql,选择使用common join或者map join
2.手动方式
select /*+mapjoin(n)*/ m.col, m.col2, n.col3 from m
join n on m.col=n.col;

替换/*+mapjoin(n)*/中的表名n值即可。

优点 

  • 不消耗集群的reduce资源(reduce相对紧缺)
  • 减少了reduce操作,加快程序执行
  • 降低网络负载
缺点 
  • 占用部分内存,所以加载到内存中的表不能过大,因为每个计算节点都会加载一次
  • 生成较多的小文件
使用场景 
  • 关联操作中有一张表非常小 
  • 不等值的链接操作

ORDER BY

按照某些字段进行排序

SELECT col1,other...
FROM table
WHERE condition
ORDER BY col1,col2 [ASC|DESC]
ORDER BY col1 ASC,col2 DESC

从表中读取数据,执行where条件,以col1,col2列的值做成组合key,其他列值作为value,然后再把数据传到同一个reduce中,根据需要的排序方式执行。

注意 

  • order by后面可以有多列进行排序,默认按字典排序 
  • order by为全局排序 
  • order by需要reduce操作,且只有一个reduce,与配置无关。数据量很大时,慎用。

DISTRIBUTE BY和SORT BY

  • DISTRIBUTE   分散数据    
distribute by col   按照col列把数据分散到不同的reduce。

  • SORT              排序 
sort by col   按照col列把数据排序

两者结合出现,确保每个reduce的输出都是有序的。

SELECT col1,col2 
FROM M
DISTRIBUTE BY col1
SORT BY col1 ASC,col2 DESC

从表中读取数据,例如,设置reduce数为3,以distribute by列的值作为key,其他列值作为value,然后把数据根据key值传到不同的reduce,然后按sort by字段进行排序。

distribute by与group by对比 

  • 都是按key值划分数据 
  • 都使用reduce操作 
  • 唯一不同的是:distribute by只是单纯的分散数据,而group by把相同key的数据聚集到一起,后续必须是聚合操作。

order by与sort by 对比 

  • order by是全局排序 
  • sort by只是确保每个reduce上面输出的数据有序。如果只有一个reduce时,和order by作用一样。

应用场景 

  • map输出的文件大小不均 
  • reduce输出文件大小不均 
  • 小文件过多 
  • 文件超大

CLUSTER BY

把有相同值的数据聚集到一起,并排序。cluster by col <==> distribute by col sort by col

参考

Hive高级查询

Hive数据库语句总结

新手的Hive指南

猜你喜欢

转载自blog.csdn.net/u013402321/article/details/80337797