我有这样的数据集:一个用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;
完成后,我像这样从Feeder表插入数据
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;
问题是,我没有达到我认为应该获得的性能,我设置了reducer的数量等。程序正在运行3000+映射器和1000+ reducer,并且映射阶段根本没有结束。