我有一个从hive读取和转换数据的spark作业。数据按日期分区,每个分区大约有2gb的数据。最好的情况下,该作业每天运行,最坏的情况下,是一个月的28/29/30/31天
转换有一些变压器,导致洗牌groupby和distinct。我有一个10集群节点,总内存为1. 5 TB,有480个核心。当运行作业时,它需要永远,然后终止。
SQL转换
With dbsase as (
SELECT
user_id,
month,
a,
b,
c,
d,
e,
f,
....,
min(day) min_day
from db.db
GROUP BY
user_id,
month,
a,
b,
c,
d,
e,
f,
....
)
SELECT
distinct min_day,
a,
b,
c,
d,
e,
f,
....
COUNT(user_id) OVER (
PARTITION BY
trunc(to_date(min_day), "MM"),
a,
b,
c,
d,
e,
f,
....
ORDER BY min_day
) cumulative_active_users
FROM dbsase
ORDER BY 1
我试过在Yarn和本地两种情况下运行这项工作[*]我试过大量的增加和减少
- 驱动程序存储器
- 执行器存储器
- 遗嘱执行人人数
但是工作还是很慢,请知道我错过了什么。谢谢
1条答案
按热度按时间q3qa4bjr1#
我觉得问题在于-
1.因为你的SQL使用的是整个表,所以它没有使用分区修剪。看看你是否可以在某个特定的月份运行。
1.对许多列执行
distinct
是一个内存密集型操作,您应该不惜一切代价避免它,或者构建一些其他的解决方案来完成它。Order by 1
-要自动加载数据,这是无用的。如果你能避免它,看看它。1.不能所有列都是键列,也不能用于比较。请找到键列并在窗口函数中使用。
如果你真的不能调整它,你可以做一个两步的方法-
步骤1 -使用主SQL并创建一个非独特表。
步骤2 -然后使用上述阶段表,并从表中得到区别,选择/插入到最终表中。