Hive:如何通过排序方式获得全局排序



order by只有一个减速器,所以速度很慢。我正试图找到一条快速的路。sort by在每个减速器中排序,那么我们如何获得全局排序?我通过搜索引擎得到了这个:

select * from 
(select title,cast(price as FLOAT) p from tablename 
distribute by time 
sort by p desc 
limit 10 ) t 
order by t.p desc 
limit 10;   

然后尝试验证它。
1.在我的配置单元表中获得正确答案。名为tablename的表中有215666条记录。

SELECT title,cast(price as FLOAT) p
from tablename 
WHERE dt='2020-03-08'
and price IS NOT NULL
ORDER BY p DESC
LIMIT 10
;

2.使用搜索到的子句。

set hive.execution.engine=mr;
set mapred.reduce.tasks=5; 
SELECT title,cast(price as FLOAT) p
from tablename
WHERE dt='2020-03-08'
and price IS NOT NULL
DISTRIBUTE BY title
SORT BY p desc
LIMIT 10
;

结果与正确答案相同!以下是我的问题:
1.为什么只返回10行?有5个减速器,每个减速器返回10个,应该是5*10=50
2.如果应该返回10行,为什么结果是全局排序?这10行不是来自同一个减速器吗?限制是随机的,它不能在5个减速器中获得全局顺序
3.如果应该返回10行,则搜索子句中的外部是多余的?

select * from 
(
) t 
order by t.p desc 
limit 10;   

考虑使用total order partitioner,请参阅https://cwiki.apache.org/confluence/display/Hive/HBaseBulkLoad#HBaseBulkLoad-PrepareRangePartitioning获取详细信息(只需忽略带有HBase的部分(

最新更新