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的部分(