testbook

ORDER BY, SORT BY, DESTRIBUTE BY和CLUSTER BY

ORDER BY
语法
SELECT select_statement ORDER BY col_name [ASC|DESC] [,col_name_2 [ASC|DESC],...]
ORDER BY对查询结果进行全排序(total ordering),所以所有数据都会经过一个单独的reducer。如果数据很多,只有一个reducer会导致计算花费大量时间。 举例
sequence是一张只有一列(列名column1),列中有1-10十个整数,按column1分3个桶的表。
[$host] transwarp> SELECT * FROM sequence ORDER BY column1;
1
2
3
4
5
6
7
8
9
10
SORT BY
语法
SELECT select_statement SORT BY col_name [ASC|DESC] [,col_name_2 [ASC|DESC],...]
说明
  • SORT BY在每个reducer之内排序,来达到局部有序(local ordering)
  • ORDER BY和SORT BY 的语法几乎完全一样,但是当一个任务用到了不止一个reducer,ORDER BY和SORT BY的输出会不一样。因为是局部有序,通过SORT BY处理的数据在各自的reducer中有序,但是reducer中数据的范围可能互相会有重叠。因为在数据非常多的情况下,ORDER BY可能导致超时,在“严格模式(strict mode)”下 (hive.mapred.mode=strict, 默认值是非严格),ORDER BY子句后必须跟着LIMIT子句。

  • 举例
    [$host] transwarp> SELECT * FROM sequence SORT BY column1;
    3
    6
    9
    1
    4
    7
    10
    2
    5
    8
    
    SORT BY让sequence的各个reducer内都有序。

    DISTRIBUTE BYSORT BY合用
    SORT BY让Inceptor在各个reducer中排序。我们可以先用DISTRIBUTE BY为输出结果人工分桶,之后使用SORT BY可以保证数据在这些桶中有序。
    语法

    SELECT select_statement
    DISTRIBUTE BY col_name_1
    SORT BY col_name_2 [ASC|DESC] [,col_name_3 [ASC|DESC],...]
    
    所有DISTRIBUTE BY列的列值相同的记录会被放进同一个reducer中。
    CLUSTER BY
    如果DISTRIBUTE BY和SORT BY子句中的列是同一个而且SORT BY顺序选择是升序,那么DISTRIBUTE BY col SORT BY col可以用CLUSTER BY col来代替,效果完全相同。比如以下两段代码的结果完全相同。
    [$host] transwarp> SELECT * FROM user_info DISTRIBUTE BY acc_level SORT BY acc_level;
    
    [$host] transwarp> SELECT * FROM user_info CLUSTER BY acc_level;