• [大数据相关] Hive中的全排序:order by,sort by, distribute by


    写mapreduce程序时,如果reduce个数>1,想要实现全排序需要控制好map的输出,详见Hadoop简单实现全排序。

    现在学了hive,写sql大家都很熟悉,如果一个order by解决了全排序还用那么麻烦写mapreduce函数吗?

    事实上,hive使用order by会默认设置reduce的个数=1,既然reducer的个数都是1了,结果自然全排序

    这也违背了充分利用分布式计算进行海量数据排序的初衷,效率低下。

    那么hive又提供了一个可供选择的方式:sort by

    它会保证每个reducer的输出文件是有序的(其实是废话,每个reducer的输出当然是有序的!),要想实现全排序,还得加一个order by的过程,就是对sort by的reduce输出结果再进行一次排序

    所以:

    要想用hive实现全排序:

    要么用order by,但这样默认了reducer个数为1,效率低下。

    要么用sort by+order by,sort by过程可以设置reducer个数(n),order by过程用n个reducer的输出文件进行一次全排序,得到最终的结果

    (个人理解,如有错误请不吝赐教,感谢!)

    注:

    (1)对于order by,sort by:

    我们可以使用limit进行限制返回的行数,从而实现抓出数据的top N的情形。

    (2)对于distribute by

    sort by为每个reducer产生一个排序文件。在有些情况下,你需要控制某个特定行应该到哪个reducer,通常是为了进行后续的聚集操作。hive的distribute by就派上用场了

    from table select year, temperature distribute by year sort by year asc, temperature desc; 

    上面实现了局部排序,且规定了:根据年份和气温对气象数据进行排序,以确保所有具有相同年份的行最终都在一个reducer分区中(文件下),可以看出,distribute by经常与sort by一起使用

    需要注意的是,hive要求distribute by要写在sort by之前

    (3)对于cluster by:

    简而言之:cluster by column=distribute by column+sort by column(注意,都是针对column列,且采用默认ASC)

    即对于上面例子:

    from table select year, temperature cluster by year;

    就等于:

    from table select year, temperature distribute by year sort by year; 

    当然这失去了按照气温排序的要求。



    参考:https://www.jianshu.com/p/1a3625a71118  仅供个人学习,有改动

  • 相关阅读:
    限制CPU个数
    delphi 不阻塞提示对话框
    快捷打开vnc 某个连接
    delphi ShellExecute 传递多个参数
    JS对JSON的操作总结 (转)
    Windows Server 2008 IIS下部署网站出现的问题
    SqlParameter序列化的问题
    求解,工作流点通过时,弹出窗口让用户录入审核意见
    oracle调度
    c# 多态
  • 原文地址:https://www.cnblogs.com/xuelisheng/p/11364456.html
Copyright © 2020-2023  润新知