目录
- hive outline
- Order By
- Sort By
- Cluster By
- Distribute By+Sort By
- hive Order By Cluster By Distribute By+Sort By 区别
hive outline
链接
Order By
- 全局排序,所有数据会进入一个reducetask,容易导致数据倾斜
- 强烈建议将limit与Order By一起使用。避免数据集行数过大
- 当hive.mapred.mode设置为strict严格模式时,使用不带LIMIT的ORDER BY时会引发异常
- 升序
按员工工资(升序)排列
- 降序
ASC(ascend): 升序(默认) DESC(descend): 降序
按员工工资降序排列
- 多列排序
按员工所在部门和工资(升序)排序
先按照部门升序排序,如果部门编号相同在按照工资升序排序
Sort By
- sort by 分区排序,数据排序在Reducer前完成
- 随机分配数据区哪个分区,所以常结合DISTRIBUTE BY(指定数据到哪个分区)
(1)先设置reduce个数(即分为3个区)
(2)根据部门编号降序排序
(3)将查询结果导入到文件中(按照部门编号降序排序)
为什么导入到文件中,因为控制台看不出来效果
带N的是部门编号,即最后一个字段
Cluster By
- 分区升序排序,分区和排序的字段一致(不能自己指定排序规则,例如降序)
- 分组的规则为hash散列:hash_func(col_name) % reduce task nums
按照学号进行分区,然后正序排序
假如说,
现在想法如下:把学生表数据根据性别分为两个部分,每个分组内根据年龄的倒序排序。你会发现CLUSTER BY无法完成了,下面的DISTRIBUTE BY +SORT BY就可以完成该功能
Distribute By+Sort By
Distribute By+Sort By 类似于Cluster By,不过Distribute By
负责分区,Sort By
负责区内排序,分区字段和排序字段可以不同
- Distribute By:类似MR中partition,进行分区,分区规则:hash散列
- Hive要求DISTRIBUTE BY语句要写在SORT BY语句之前
- 如果DISTRIBUTE BY +SORT BY的字段一样,并且升序排序,可以得出下列结论:
CLUSTER BY=DISTRIBUTE BY +SORT BY(字段一样)
把学生表数据根据性别分为两个部分,每个分组内根据年龄的倒序排
hive Order By Cluster By Distribute By+Sort By 区别
- Order By 全局排序,所有数据会进入一个reducetask
- Sort By 分区排序,数据排序在Reducer前完成,数据随机被分配到各个分区,如果要指定数据去哪个分区,需要使用Distribute By
- Cluster By 分区升序排序,分区和排序的字段一致(不能自己指定排序规则,例如降序)
- Distribute By+Sort By类似于Cluster By,不过
Distribute By
负责分区,Sort By
负责区内排序,分区字段和排序字段可以不同,排序规则也可以自己指定