hive:如何使用sort by获得全局排序

ux6nzvsh  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(499)

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.使用searched子句。

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;
dgiusagp

dgiusagp1#

考虑使用 total order partitioner ,请参见https://cwiki.apache.org/confluence/display/hive/hbasebulkload#hbasebulkload-preparerangepartitioning了解详细信息(只需忽略hbase的部分)

相关问题