在pyspark中使用collect\u list时java内存不足

jhdbpxl9  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(444)

我目前正在使用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,所以任何帮助将不胜感激。

svmlkihl

svmlkihl1#

显然,您正试图将一个巨大结果集的所有行加载到内存中。
我怀疑你的名单引起了一些问题。
很可能是这样。
解决方案要么是增加堆的大小1,要么是改变处理结果集的方式,这样就不需要同时将其保存在内存中。
1 - ... 可能通过更多的内存,更大的机器,等等,你可以看到这是去哪里。

相关问题