我目前正在使用pyspark,并在一个有大约6亿条记录的表上运行一个查询。表本身约为300gb。我的查询如下所示:
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,所以任何帮助将不胜感激。
1条答案
按热度按时间svmlkihl1#
显然,您正试图将一个巨大结果集的所有行加载到内存中。
我怀疑你的名单引起了一些问题。
很可能是这样。
解决方案要么是增加堆的大小1,要么是改变处理结果集的方式,这样就不需要同时将其保存在内存中。
1 - ... 可能通过更多的内存,更大的机器,等等,你可以看到这是去哪里。