Улей: как получить глобальный порядок с сортировкой по - PullRequest
0 голосов
/ 20 марта 2020

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;   

1 Ответ

0 голосов
/ 20 марта 2020

Рассмотрите возможность использования total order partitioner, см. https://cwiki.apache.org/confluence/display/Hive/HBaseBulkLoad#HBaseBulkLoad -PrepareRangePartitioning для деталей (просто игнорируйте деталь с HBase)

...