代码之家  ›  专栏  ›  技术社区  ›  Justin

在PySpark中使用collect\u list时Java内存不足

  •  0
  • Justin  · 技术社区  · 8 年前

    我目前正在使用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 回复  |  直到 8 年前
        1
  •  1
  •   Stephen C    8 年前

    显然,您正在尝试将大型结果集的所有行加载到内存中。

    我怀疑collect\u list导致了一些问题。

    这很可能是对的。

    解决方案要么是增加堆大小 1. 或者更改处理结果集的方式,以便 不要 需要同时将其保存在内存中。


    1 - ... 可能通过更多的RAM、更大的机器等,您可以看到这将走向何方。