zoukankan      html  css  js  c++  java
  • hive中的全排序

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

    现在学了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;

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

  • 相关阅读:
    JS BOM对象 History对象 Location对象
    JS 字符串对象 数组对象 函数对象 函数作用域
    JS 引入方式 基本数据类型 运算符 控制语句 循环 异常
    Pycharm Html CSS JS 快捷方式创建元素
    CSS 内外边距 float positio属性
    CSS 颜色 字体 背景 文本 边框 列表 display属性
    【Android】RxJava的使用(三)转换——map、flatMap
    【Android】RxJava的使用(二)Action
    【Android】RxJava的使用(一)基本用法
    【Android】Retrofit 2.0 的使用
  • 原文地址:https://www.cnblogs.com/itboys/p/6004261.html
Copyright © 2011-2022 走看看