前言
作为数据开发工程师,在平时工作中,肯定接到过产品小姐姐提的排序需求,例如在mysql数据库中,就是使用order by函数。在hive中也是有order by函数的,那么除了order by之外是否还有其他排序函数呢?今天就跟小伙伴们聊聊hive中有哪些排序函数以及使用场景!
1. order by
全局排序,默认升序。Hive在运行MR程序时会指定Reducer个数为1,因为多个reducer无法保证全局有序。这样就会导致当输入规模较大时,需要较长的计算时间。
注意:
- 与数据库中 order by 的区别:在hive.mapred.mode = strict 模式下,必须指定 limit,否则执行会报错。 原因:如果在数据量大的情况下,一个reducer无法处理;如果指定limit n ,就只有 n * map number 条记录而已,一个reducer就可以正常处理。
- 其他情况下,与数据库中的Order by 功能一致,即按照某一个或几个字段排序输出。
2. sort by
局部排序。其在数据进入reducer前完成排序。
若需要全局排序结果, 只需再进行一次归并排序即可。
注意:需要根据实际情况设置Reducer个数,设置set mapreduce.job.reduces=n,(n>1)
3. distribute by
分区排序。顾名思义,是起分散数据作用的,类似 MR 中 partition,进行分区。比如:distribute by c1,则是拿c1列作为key分散到不同的reducer里去,默认采取的是hash算法。
大家有没有觉得它跟group by很像呢?其实它两唯一的区别,distribute by只是分发数据到reducer,而group by将数据分发完以后,必须只能跟count,sum,avg等聚合操作。
注意:
- 这里 Hive 所使用的 key 并不是表中的 key, 而是 Hive 指定的多列结合的特殊 key: 所使用的变量 mapreduce.map.ouput.key.class 为 org.apache.hadoop.hive.ql.io.HiveKey
- 如果想要排序, 需要结合 sort by 使用,并且distribute by 语句要写在 sort by 语句之前
4. cluster by
簇排序。cluster by 具有 distribute by 和 sort by 的组合功能,即当 distribute by 和 sort by 字段相同时,可使用 cluster by 方式替代。但是cluster by排序只能是升序排序,不能指定排序规则为ASC或者DESC。
注意:cluster by 和 distribute by 是很相似的,也采用HashPartition算法,区别在于:cluster by 里含有一个分桶的方法
总结
只有了解了各个排序函数的功能和使用场景,才能在开发过程中达到事半功倍的效果,提升HQL性能,节省计算资源,提质增效。