我正在对 Databricks 中托管的巨大 Delta 表的数据框进行非常简单的操作。我面临的问题是,运行几个小时后,代码失败,并显示错误“作业因阶段失败而中止:59014 个任务的序列化结果的总大小 (4.0 GiB) 大于spark.driver.maxResultSize 4.0 GiB” ”。
我正在执行的任务是,我读取数据框中的增量表,添加一个新列用于创建存储桶(20个存储桶),并以覆盖模式保存表,将存储桶添加为另一个分区(已经有3个分区,这个新分区)列将是第四个分区)。因此,我没有在应用程序代码中执行任何会导致大量数据返回驱动程序的操作。下面给出的是示例代码
bucket_number = 20
inputDataframe = spark.read.table("huge_delta_table")
inputDataframe = inputDataframe.withColumn("bucket_key", (translate( substring(col("some_column"), 0, 16), "abcdefghijklmnopqrstuvwxyz", "01234567890123456789012345").cast(LongType()) %buckets_number)+1)
inputDatafrme.write.format("delta")
input.write.format("delta").mode("overwrite").option("overwriteSchema", "true").partitionBy("existing_partition_column1","existing_partition_column2","existing_partition_column3","bucket_key") \
.saveAsTable("huge_delta_table")
Run Code Online (Sandbox Code Playgroud)
我想知道,是否是因为大量的任务导致 Spark 的内部结果元数据变得巨大(当出于协调目的而传回驱动程序时)?