ハイブでのorderby、sort by、distribute by、clusterbyの違いの詳細な説明

1.注文者

  在hive中order by是进行全局排序的,这也就是说会最后会在一个reduce
中进行统一的排序,所以说使用order by进行全局排序尽量不要对数据量很
大 的表进行全局排序,这样效率会很低,会对进行排序的那一个reduce所在
的节点造成内存压力。
使用order by会受到如下属性的约束:
set hive.mapred.mode=nonstrict;
set hive.mapred.mode=strict;
  默认是在nonstrict模式下的,如果在strict模式下使用order by的话必
须使用limit关键字,这里只是讲解一下order by的排序是在哪里进行的,
就不举例子说明了,总之使用order by进行排序的时候要注意数据量的问题
具体的使用规则在之前的文章中已经进行了讲解,如果有想要了解的可通过
如下网址看一下:

詳細な説明による注文

2.並べ替え

  hive中的sort by是进行的区内排序,如果指定了reduce的个数唯一,那
么排序的结果就是全局排序,如果有多个reduce就是区内有序,全局无序,
这个要根据个人的需求来使用。
使用语法如下:
select * from tb_name sort by column_name;
数据表如下:
gtype 価格
チューインガム 食物 10
ポテトチップス 食物 20
チョコレート 食物 30
ケーキ 食物 40
フライドポテト 食物 50
ビスケット 食物 60
パン 食物 70
月餅 食物 80
インスタントラーメン 食物 90
粉末洗剤 日用品 11
洗濯洗剤 日用品 21
食器洗い洗剤 日用品 31
モップ 日用品 41
タオル 日用品 51
トイレットペーパー 日用品 61
ウォーターカップ 日用品 71
ケトル 日用品 81
椅子 日用品 91
テレビ 電気製品 12
コンピューター 電気製品 22
冷蔵庫 電気製品 32
冷凍庫 電気製品 42
洗濯機 電気製品 52
小さな太陽 電気製品 62
電気ヒーター 電気製品 72
電磁調理器 電気製品 82
空調 電気製品 92
湯沸かし器 電気製品 102
先将reduce的个数设置为1
set mapred.reduce.tasks=1;
结果数据如下:
gtype 価格
チューインガム 食物 10
粉末洗剤 日用品 11
テレビ 電気製品 12
ポテトチップス 食物 20
洗濯洗剤 日用品 21
コンピューター 電気製品 22
チョコレート 食物 30
食器洗い洗剤 日用品 31
冷蔵庫 電気製品 32
ケーキ 食物 40
モップ 日用品 41
冷凍庫 電気製品 42
フライドポテト 食物 50
タオル 日用品 51
洗濯機 電気製品 52
ビスケット 食物 60
トイレットペーパー 日用品 61
小さな太陽 電気製品 62
パン 食物 70
ウォーターカップ 日用品 71
電気ヒーター 電気製品 72
月餅 食物 80
ケトル 日用品 81
電磁調理器 電気製品 82
インスタントラーメン 食物 90
椅子 日用品 91
空調 電気製品 92
湯沸かし器 電気製品 102
从结果可以看出来当将reduce的个数设置为1的时候,使用sort by进
行排序结果是全局有序的。

现在将reduce的个数设置为3
set mapred.reduce.tasks=3;
结果数据如下:
gtype 価格 rn
湯沸かし器 電気製品 102 1
空調 電気製品 92 2
電磁調理器 電気製品 82 3
電気ヒーター 電気製品 72 4
小さな太陽 電気製品 62 5
洗濯機 電気製品 52 6
冷凍庫 電気製品 42 7
冷蔵庫 電気製品 32 8
コンピューター 電気製品 22 9
テレビ 電気製品 12 10
椅子 日用品 91 11
ケトル 日用品 81 12
ウォーターカップ 日用品 71 13
トイレットペーパー 日用品 61 14
タオル 日用品 51 15
モップ 日用品 41 16
食器洗い洗剤 日用品 31 17
洗濯洗剤 日用品 21 18
粉末洗剤 日用品 11 19
インスタントラーメン 食物 90 20
月餅 食物 80 21
パン 食物 70 22
ビスケット 食物 60 23
フライドポテト 食物 50 24
ケーキ 食物 40 25
チョコレート 食物 30 26
ポテトチップス 食物 20 27
チューインガム 食物 10 28
  从结果数据中可以看出来从行号'rn'的1~10中的数据是有序的,11~19
中的数据是有序的,20~28中的数据是有序的都是倒序,但是全局是无序的,
所以在使用sort by的时候一定要根据需求来使用,否则最后的结果可能并
不是我们想要的结果。

3.配布者

  在hive中distribute by是控制map中的数据是如何分发的,使用的hash
计算,使用distribute by指定字段就可以使map端按照执行的字段进行hash
分区,相同的key可以被分到一个reduce中,但是单独使用distribute by
不能保证数据是有序的,所以一般配合sort by来使用。

单独使用语法如下:
select * from tb_name distribute by column_name;
单独使用的结果数据如下:
gtype 価格
チューインガム 食物 10
ポテトチップス 食物 20
チョコレート 食物 30
ケーキ 食物 40
フライドポテト 食物 50
ビスケット 食物 60
パン 食物 70
月餅 食物 80
インスタントラーメン 食物 90
タオル 日用品 51
椅子 日用品 91
ケトル 日用品 81
ウォーターカップ 日用品 71
トイレットペーパー 日用品 61
モップ 日用品 41
食器洗い洗剤 日用品 31
洗濯洗剤 日用品 21
粉末洗剤 日用品 11
湯沸かし器 電気製品 102
コンピューター 電気製品 22
冷蔵庫 電気製品 32
冷凍庫 電気製品 42
洗濯機 電気製品 52
小さな太陽 電気製品 62
テレビ 電気製品 12
電気ヒーター 電気製品 72
電磁調理器 電気製品 82
空調 電気製品 92
很清晰的可以看出在电器商品类中的价格是无序的。

配合sort by使用的如法如下:
select 
  * 
from tb_name
distribute by column_name1 
sort by column_name2;
  语法中的字段名字"column_name1"和"column_name2"是可以不相同的,
也可以是相同的,这个要看在使用distribute byf分区之后想要根据哪个
字段进行sort by排序。
  这里的结果数据就不展示了,不同分区中的数据肯定是有序的,展示的意
义不大。

によるクラスター

  hive中的cluster的作用其实就相当与distribute by和sort by结合使
用,不过使用cluster by不能指定排序规则(asc,desc),只能是升序排序,
同时在使用cluster by进行排序的时候没办法像distribute by和sort by
的组合那样可以灵活的指定在分区后根据哪个字段进行排序。
  相信这个时候我们有这样的一个疑问"cluster by存在意义是什么?使用
某个字段分区,再根据这个字段排序意义在哪里?",当这个字段中的数据
值的种类大于分区数的时候就有意义了,就拿我的测试数据举例,假如商品
的种类有1000种,但 reduce的个数只有30个,这个时候cluser by的使用
就有意义了,相信说到这里大家应该都能明白了。

使用语法如下:
select * from tb_name cluster by column_name;
  在这里要跟大家说一下,如果在cluster by后面添加了多个字段,那么在
分 区的时候就会根据这几个字段和reduce的个数来计算hash了分区,如果
在使用cluster by的时候一定要注意这个特点。

在这给大家举个测试的例子,测试sql如下:
select * from t_test cluster by gtype,price;
测试结果数据如下:
gtype 価格
粉末洗剤 日用品 11
モップ 日用品 41
ウォーターカップ 日用品 71
テレビ 電気製品 12
冷凍庫 電気製品 42
電気ヒーター 電気製品 72
湯沸かし器 電気製品 102
チューインガム 食物 10
ケーキ 食物 40
パン 食物 70
洗濯洗剤 日用品 21
タオル 日用品 51
ケトル 日用品 81
コンピューター 電気製品 22
洗濯機 電気製品 52
電磁調理器 電気製品 82
ポテトチップス 食物 20
フライドポテト 食物 50
月餅 食物 80
食器洗い洗剤 日用品 31
トイレットペーパー 日用品 61
椅子 日用品 91
冷蔵庫 電気製品 32
小さな太陽 電気製品 62
空調 電気製品 92
チョコレート 食物 30
ビスケット 食物 60
インスタントラーメン 食物 90
  通过结果数据可以看到,这个分区似乎有些乱了,但是仔细看看数据的
话可以看出来这是根据gtype和price两个字段分区结果,就拿"日用品",
这个种类举例子,我们看一下结果表中的前三个日用品后面的价格,可
以看到,分别是"11,41,71",在看看中间部分的日用品的价格分别是"21,
51,81",最后面三个日用品的价格是"31,61,91",大家可以发现这三组价格
中的数据组内和3取模得到的结果都是一样的,组间取模都是不同的,所以
可以很清晰看出是将"日用品"类的商品分散到了三个reduce中进行排序的。
  举这个例子是为了让大家在使用cluster by的时候一定要注意这个特点,
避免踩坑。

おすすめ

転載: blog.csdn.net/AnameJL/article/details/112548928