天天看点

Hive order by、sort by、distribute byORDER BYSORT BYDISTRIBUTE BY

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语句之前。