用于大型数据集窗口化的Hive查询性能

时间:2019-06-11 14:42:29

标签: performance optimization hive hiveql hdp

我有这样的数据集:一个用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,并且映射阶段根本没有结束。

0 个答案:

没有答案