Hive查询语言(HiveQL)

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参数(duce.tasks=50)
输出⽂件个数与reduce数相同,⽂件⼤⼩与reduce处理的数据量有关
数据倾斜,优化参数skewindata (upby.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表中存在,出存在的数据。
l 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  (右表)
l
WHERE condition    (reduced端执⾏)
读取数据执⾏where条件,按col列分组,把col列的内容作为key,其他列作为value,传到reduce,在reduce端执⾏连接操作和where过滤。
MAPJOIN
map side join,在map端把⼩表加载到内存中,然后读取⼤表,和内存中的⼩表完成连接操作,使⽤了分布式缓存技术。
从⼤表读取数据,执⾏where条件。把⼩表加载到内存中,每读取⼤表中的⼀条数据,都要和内存中的⼩表数据进⾏⽐较。
有两种设置⽅式
1.⾃动⽅式
set vert.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 l;
替换/*+mapjoin(n)*/中的表名n值即可。
人脸识别智能门禁
优点
不消耗集的reduce资源(reduce相对紧缺)
减少了reduce操作,加快程序执⾏
降低⽹络负载
缺点
占⽤部分内存,所以加载到内存中的表不能过⼤,因为每个计算节点都会加载⼀次
⽣成较多的⼩⽂件
使⽤场景
关联操作中有⼀张表⾮常⼩
不等值的链接操作
ORDER BY
按照某些字段进⾏排序
SELECT
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,与配置⽆关。数据量很⼤时,慎⽤。
51raDISTRIBUTE 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 参考

本文发布于:2024-09-20 22:48:38,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/306838.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   操作   表中   排序   存在   内存
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议