Order by 能够预期产生完全排序的结果,但是它是通过只用一个reduce来做到这点的。所以对于大规模的数据集它的效率非常低。在很多情况下,并不需要全局排序,此时可以换成Hive的非标准扩展sort by。Sort by为每个reducer产生一个排序文件。在有些情况下,你需要控制某个特定行应该到哪个reducer,通常是为了进行后续的聚集操作。Hive的distribute by 子句可以做这件事。
- // 根据年份和气温对气象数据进行排序,以确保所有具有相同年份的行最终都在一个reducer分区中
- From record2
- select year, temperature
- distribute by year
- sort by year asc, temperature desc;
因此,distribute by 经常和 sort by 配合使用。
原理:Order by 是将所有的数据一起排序,就是将所有的数据都放到一个reduce中操作,这样对于不需要精确排序且又是大数据集合就很不适合。
所以,我们需要将大数据集合进行分组,而distribute by 就是指定那一个或几个字段作为分组字段,就是划分reduce的数据的依据字段。
这样的结果就是distribute by 的字段会保证全局的排序正确,而sort by 中出现但在distribute by中没有出现的数据,只能保证局部有序,全局不一定。
以上,原理要在数据去重当中格外小心。可能会出现由于执行环境的不同,造成执行计划不同,从而造成有时候可以去重,有时候不能去重的诡异现象。