优化Pyspark的Collect_List函数

时间:2019-10-17 15:42:00

标签: python python-3.x pyspark

我需要汇总我的数据,以便它生成以下输出:

JSON输出

{
    "people": [
       {
         "firstName": "Jimi",
         "lastName": "Hendrix",
         "age": "27"
       },
       {
         "firstName": "Jimmy",
         "lastName": "Page",
         "age": "75"
       }
    ]
}

但是,当运行聚合函数(如下)时,出现此错误:

Caused by: org:apache.spark.SparkSession: Job aborted due to stage failure: Total size of serialized results of <task_size> task (20GB) is bigger than spark.driver.maxResultSize (20.0 GB)
  

这使我相信collect_list函数是导致此问题的原因。它们不是并行运行任务,而是在单个节点上运行并耗尽内存。

创建JSON输出的最佳方法是什么?有什么方法可以优化collect_list函数吗?

示例代码:

def aggregate(df):
    return df.agg(collect_list(struct(
        df.firstName,
        df.lastName,
        df.age
    )).alias('people'))

1 个答案:

答案 0 :(得分:0)

当您执行collect_list时,所有数据都作为列表收集到驱动程序。您可以使用JSON在数据框中创建一列,并将其存储为CSV来代替。

替代方法是使用-

增加驱动程序内存

conf.set(“ spark.driver.maxResultSize”,“ 25g”)