Hive中实现SELECT TOP N的方法

TOP N是实现最大/小N条数据。

鉴于Hive提供了limit关键字,配合排序功能就很容易实现了。

但是Hive中order by只能生成1个reduce,如果表的数据量太大,order by 就会有心无力

例如SQL:select a from t_test order by a limit 10;

控制台会输出:Number of reduce tasks determined at compile time: 1

说明启动的reduce数是编译时决定的,查看该SQL的执行计划,发现只启动1个Job

如果表数据量非常大,而我们只想取Top 10,那么这么做就非常不合理

这样就可以考虑sort by ,就可以解决这个问题了

select a from t_test sort by a limit 10;

控制台会输出:Number of reduce tasks not specified. Estimated from input data size: 1

说明reduce数不是编译时决定的,而是根据输入的文件大小动态决定的。

sort by可以启动多个reduce,每个reduce做局部排序,这对于sort by limit N已经够了。

从执行计划来看,sort by limit N启动了两个Job,第一个Job在每个reduce中做局部排序,分别取出Top N,然后第二个Job做全局排序,取出Top N得出想要的结果。

假设:第一个Job启动了x个reduce,第二个Job对x个reduce排好序的x * N条数据做全局排序,取Top N ,从而得到想要的结果。

这样就大大提升了select 效率。

猜你喜欢

转载自www.cnblogs.com/zbw1112/p/12550751.html