zoukankan      html  css  js  c++  java
  • Hive 的 排序

    全排序:order by对全部所有的数据进行排序,在实现的时候是放到一个reduce中进行的,可以想象这样做效率是比较低的;

    局部排序:sort by对数据进行分组,然后在组内进行排序,每个reduce分别进行自己的排序;

    row_num()函数:row_num函数通常用over(partition by id),把后面相同id的划分为一组,对这一组内的数据来进行排列;

    distribute by:控制着在map端如何分区,按照什么字段进行分区,要注意均衡。在有些情况下,你需要控制某个特定行应该到哪个reducer,通常是为了进行后续的聚集操作。Hive的distribute by 子句可以做这件事。这里就是MR程序员经常做的,设置PARTITION类的过程,此处已经成为一种语法;
     
    sort by:每个reduce按照sort by 字段进行排序,reduce的数量按照默认的数量来进行,当然可以指定。最终可以进行归并排序得出结果。适用于数据量比较大的排序场景。在很多情况下,并不需要全局排序,此时可以换成Hive的非标准扩展sort by。Sort by为每个reducer产生一个排序文件;
     
    order by:reduce只有一个,在一个reduce中完成排序,使用于数据量小的场景。能够预期产生完全排序的结果,但是它是通过只用一个reduce来做到这点的。所以对于大规模的数据集它的效率非常低;
     
    partition by:partition by指定按照字段进行分组,能够和row_num一起使用
     

     例如

    1. // 根据年份和气温对气象数据进行排序,以确保所有具有相同年份的行最终都在一个reducer分区中  
    2.   
    3. From record2  
    4. select year, temperature  
    5. distribute by year  
    6. sort by year asc, temperature desc;  

    因此,distribute by 经常和 sort by 配合使用。
  • 相关阅读:
    Heterogeneity Wins
    Android使用ImageView显示网络图片
    Android OOM的解决方式
    洛谷P3390 【模板】矩阵快速幂
    CF732D. Exams[二分答案 贪心]
    洛谷P3388 【模板】割点
    POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]
    NOI2001|POJ1182食物链[种类并查集 向量]
    HDU3038 How Many Answers Are Wrong[带权并查集]
    NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]
  • 原文地址:https://www.cnblogs.com/laodageblog/p/4091964.html
Copyright © 2011-2022 走看看