0

我有这样的数据集一个由 ID 标识的人,使用由另一个 ID 标识的某个对象以及他使用该 ID 的时间量。我想知道这个人最常用的前 20 个项目。数据量非常大,超过1亿,每个id可以产生大约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+ 减速器,映射阶段根本没有结束。

4

0 回答 0