Производительность запросов Hive для создания окон для большого набора данных - PullRequest
0 голосов
/ 11 июня 2019

У меня есть такой набор данных. Человек, идентифицированный идентификатором, использует какой-либо объект, идентифицированный другим идентификатором, и количество времени, которое он использует. Я хочу знать первые 20 предметов, которые высоко используются человеком Объем данных очень велик - более 100 миллионов, и каждый идентификатор может создать около 200 объектов, которые он может использовать.

Итак, во-первых, я создал проекционную таблицу с кластером и держал все в порядке, как все будет происходить в маппере, чтобы все вещи были в одном месте в узле, так что маппер при его распределении найдет вещи локально

CREATE TABLE person_objectid_dwell ( person string, objectid string, sum_dwell bigint)
CLUSTERED BY (person) SORTED BY (sum_dwell desc,objectid asc)INTO 100 BUCKETS STORED AS ORC;

И когда я закончил, я вставил данные из таблицы фидеров вот так

insert into person_objectid_dwell  select person, objectid, sum_dwell from person_objectid_dwell distribute by person sort by sum_dwell desc, objectid asc;

И затем запрос с использованием окон с созданием таблицы

create table person_top20_objectsdwell as select * from ( select person, objectid, sum_dwell, 
rank() over (partition by person order by sum_dwell  desc ) as rank
from person_objectid_dwell ) t where rank <21;

Проблема в том, что я не получаю ту производительность, которую, я думаю, я должен получить, я устанавливаю количество редукторов и т. Д. Программа работает с 3000+ мапперами и 1000+ редукторами, а фаза картирования вообще не заканчивается.

...