ORDER BY
Hive中的ORDER By和其他的SQL中的定义时一样的,用于对查询结果进行一个统一的排序。在Hive中,该语句会将所有的数据都通过一个reducer进行处理,对于大数据集会是一个瓶颈。
Hive中的order by语句有一些限制,在strict模式下(hive.mapred.mode=strict),order by语句后面需要跟上limit 语句,原因在于order by是全局排序,使用的是一个reducer,大的数据集场景下会需要非常久的时间,因此Hive对其进行了限制。如果使用nostrict模式,则不需要该限制。
Hive 3.0.0之后,子查询或试图中的order by若是没有limit,则优化器会将其order by移除,可以使用hive.remove.orderby.in.subquery
来禁用该特性。
SORT BY
SORT BY是Hive中特有的一种语句,其只会在每个reducer中对数据进行一个局部排序,保证每个reducer的输出都是有序的,这样可以提高之后全局排序的效率。
Hive 3.0.0之后,子查询或试图中的sort by若是没有limit,则优化器会将其order by移除,可以使用hive.remove.orderby.in.subquery
来禁用该特性。
DISTRIBUTE BY
DISTRIBUTE BY控制在map的输出在reducer是如何划分的。默认情况下,MapReduce框架会根据map数据的key计算其hash值,然后根据该hash值分发到reducer中,使用了DISTRIBUTED BY时,可以保证DISTRIBUTED BY指定的列值相同时能够分发到同一个reducer中进行处理。
DISTRIBUTE BY不允许cluster by 或者是 sort by 使用DIS
含有SORT BY的DISTRIBUTE BY
在使用SORT BY时会出现不同Reducer的输出内容会有明显的重叠,如:
// ymd:年月日,symbol:交易码, price_close: 价格
SELECT s.ymd, s.symbol, s.price_close
FROM stocks s
SORT BY s.symbol ASC, s.ymd ASC;
以上例子中会出现同一个symbol的股票数据分布在多个reducer中,因此其结果会有重叠。
该场景下使用DISTRIBUTE BY能够有效的防止该情况。
SELECT s.ymd, s.symbol, s.price_close
FROM stocks s
DISTRIBUTE BU s.symbol
SORT BY s.symbol ASC, s.ymd ASC;
DISTRIBUTE BY和GROUP BY在控制着reducer是如何接受一行行数据处理方面是类似的,而SORT BY则控制着reducer内的数据是如何进行排序的。
需要注意的是,DISTRIBUTE BY语句需要写在SORT BY语句之前。