Hive:order by,sort by,distribute by与cluster by

转载专用:
        读到了好文章,用于分享收藏,侵权删。
        转发自大佬:慢点走,https://blog.csdn.net/weixin_42845682
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42845682/article/details/117033683

目录

引入:

order by:

sort by:

distribute by:

distribute by 、 sort by:

cluster by(等价于 distribute by + sort by):

原博主大佬对评论的回复:

cluster by解决数据倾斜:

cluster by方便查看输出文件:


引入:

不要用cluster by和group by去作比较,要做比较也应该是和order by作比较。cluster by的分区和 group by 的分区完全是两码事。cluster by是hive中的,mysql等数据库中是没有的,那为什么hive会出现cluster by呢?

order by:

当需要对数据排序时,我们可以使用order by。但使用order by意味着对所有数据进行排序,即:无论有多少个map,无论有多少数据量,都只用一个reduce。这会消耗极大的时间,且数据量大时,对资源消耗也极为巨大。这种情况肯定是不能忍受的,但又没有什么好的解决办法,退而求其次,不要求全局有序,只要求局部有序,也是一种解决办法。于是:sort by出现了。

 举个例子:某学校对学生成绩进行排序。

select * from t_score order by grade
-- 因为使用了order by,只会有一个reduce。

sort by:

使用sort by时,会有多个reduce。每个reduce端都会进行排序,但这时,每个reduce的数据是有序的,但数据全局上看依然是无序的。也就是局部有序,整体无序。

distribute by:

使用sort by时,数据是局部有序,整体无序。但这时候,哪些数据进入同一个reduce是随机的,不可把控的。所以可以使用 distribute by 来指定哪些数据进入同一个reduce。也就是说,我们可以指定哪些数据进入到同一个reduce中,然后这些数据进行排序。

distribute by 、 sort by:

假设学生太多,数据太多,无法使用order by进行全局排序,这时候我们可以要求学生的成绩按照专业进行排序,不要求在全校内排序。即:

select * from t_score 
distribute by major sort by grade

-- 因为没有使用order by,所以这时可以有多个reduce

但是,如果reduce的数量小于专业的数量,就会有多个专业在一个reduce中处理的情况,这时候,如果还是distribute by major sort by grade,就会乱序。即:多个专业分到一个区,且直接按照分数排序。对于这种情况,我们需要先按照专业排序,再按照分数排序:

select * from t_score 
distribute by major sort by major, grade

-- 因为没有使用order by,所以这时可以有多个reduce

cluster by(等价于 distribute by + sort by):

cluster by 除了具有distribute by的功能外,还会对该字段进行排序。当distribute by和sort by 字段相同时,可以使用cluster by 代替。

 

 

原博主大佬对评论的回复:

那位同学回复的内容是:

假如100个专业分了10个区,那么每一个区里都应该会有不同的专业。但反过来说,真正的mr 并没有完全按专业分区,如果完全的话那应该是100个区。问题是结果只有10个区,这么做意义的结果总结一下应该是:cluster by 的字段只是参考分区字段,而非严格的按此字段分区。是不是这样?求回复评价。

博主的回复:
      首先,假如100个专业分了10个区,那么每一个区里都应该会有不同的专业。但反过来说,真正的mr 并没有完全按专业分区,如果完全的话那应该是100个区。问题是结果只有10个区,这些说的都对。最后的问题是:“cluster by 的字段只是参考分区字段,而非严格的按此字段分区。是不是这样?”。
      我认为不是的,cluster by是严格按照字段区分的,100个专业分了100个区,问题是你只有10个reduce,所以才会出现一个区里有不同的专业。 分区规则是根据分区字段的hash码与reduce的个数进行模除后,余数相同的分到一个区。

cluster by解决数据倾斜:

distribute by可以实现打乱数据从而解决数据倾斜的效果,但是解决以后数据是无序的,使用cluster by可以在解决数据倾斜的效果之上实现局部有序。

cluster by方便查看输出文件:

hive可以将查询结果保存到hdfs上,数据量太大且只有一个文件时,查看和传输都很不方便。如果按照固定的大小或条数分开保存,又会出现数据不连贯的情况。
      这时候,使用cluster by,既可以生成多个文件,又可以保证数据局部有序且连贯。
      连贯的意思是:假设我看一个学校的学生的成绩,重点关注专业。当人为或使用其他办法(标准是:固定的大小或条数分开保存)分片保存数据时,就会出现某专业的学生出现在多个文件中,对查看数据很不友好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值