我目前正在使用PySpark并在一个有大约6亿条记录的表上运行查询。桌子本身约300克。我的查询看起来像这样:
select f1, collect_list(struct(f2, f3)) as fdata
from table
group by 1
目前,我收到此错误:
# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="kill -9 %p"
# Executing /bin/sh -c "kill -9 1010"...
Killed
另一件事是(f2, f3)
元组的分布不均匀。有些f1
可能有10万个这样的元组,而其他一些f1
可能只有5个。我怀疑collect_list
会导致一些问题。
我总是可以增加群集大小,但我想知道我是否可以对表做些什么。由f1
分区也不是一种选择,因为它具有非常高的维度。我对Spark或Hive没有太多经验,所以任何帮助都会受到赞赏。
答案 0 :(得分:1)
您显然正在尝试将巨大结果集的所有行加载到内存中。
我怀疑collect_list导致了一些问题。
这很可能是正确的。
解决方案要么是增加堆大小 1 ,要么改变处理结果集的方式,以便不需要保留所有在记忆中同时。
1 - ......可能还有更多的RAM,更大的机器等。你可以看到它的发展方向。