我有这样一个数据集,一个用id标识的人,使用另一个id标识的对象,以及他使用这个对象的时间。我想知道这个人最常用的前20项。数据量非常大,超过1亿,每个id可以产生大约200个他可能使用的对象。
首先,我用cluster创建了一个投影表,并对Map器中发生的事情进行排序,这样所有的事情都会在节点中的一个位置上,这样Map器在分发时会在本地找到这些事情
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;
问题是我没有得到我认为我应该得到的性能,我设置了减速器的数量等。程序正在运行3000+Map器和1000+减速器和Map阶段是没有得到一点。
暂无答案!
目前还没有任何答案,快来回答吧!