performance - 大型数据集窗口化的 Hive 查询性能
问题描述
我有这样的数据集一个由 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+ 减速器,映射阶段根本没有结束。
解决方案
推荐阅读
- javascript - TypeError:“warnInfo”不可迭代
- grafana - 在 png 图像上叠加 Grafana 图?
- c# - 尝试在 asp.net 核心应用程序中使用 SmtpClient 发送电子邮件时出错
- javascript - React & Materialise - Material Box 选项的实现
- css - flex 项目如果 wrap 将挤压另一个固定宽度的 flex 项目空间
- google-apps-script - 如何在 Google Apps 脚本和 onFormSubmit 触发器中添加 cc
- python - 如何使用 Python-VLC 模块编译/部署 Python 应用程序
- javascript - 验证 expressJWT 中的无效令牌
- javascript - 创建正则表达式以匹配整个字符串并且可以重复
- mysql - SQL选择列具有一定长度和最大值的行