У меня есть такой набор данных. Человек, идентифицированный идентификатором, использует какой-либо объект, идентифицированный другим идентификатором, и количество времени, которое он использует. Я хочу знать первые 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+ редукторами, а фаза картирования вообще не заканчивается.