Spark 正在将分区键上的排序操作添加到查询计划中。这会减慢构建速度,增加内存使用量并导致磁盘溢出。我确信这是一种新的行为,尽管我无法……
Spark 正在将分区键上的排序操作添加到查询计划中。
这会减慢构建速度,增加内存使用量并导致磁盘溢出。
我确信这是一种新的行为,尽管我无法验证,因为旧版本的火花详细信息不再可用。
写入逻辑:
df = df.repartition('date')
tgt.write_dataframe(df, partition_cols=['date'])
逻辑计划如下:
InsertIntoHadoopFsRelationCommand foundry://...
+- WriteFiles
+- Sort [date#337 ASC NULLS FIRST], false
+- Project ...
+- CollectMetrics ...
+- RepartitionByExpression [date#337]
+- Project ...
这些问题看起来可能相关,但它们应该在 Spark 3.4+ 中得到修复:
我相信直到最近我们的 Foundry 实例还在使用 Spark 3.2.1,但无论目标 Spark 版本是什么,运行时版本都已悄然更改为 Spark 3.4 和 3.5。
这种排序有必要吗?可以将其删除吗?
根据 SPARK-44512 , partitionBy
不保证排序。
它可以对您的数据进行排序(即使您已明确对其进行排序):
虽然我理解 Apache Spark 3.4.0 改变了上述行为,但 I don't think there is a contract that Apache Spark's
partitionBy
operation preserves the previous ordering .因此,让我结束这个问题,因为
Not A Problem
.
据我所知,这种行为没有记录。
要从执行计划中删除排序,您可以设置这个未记录的配置值: spark.sql.optimizer.plannedWrite.enabled=false
.
在 Foundry 中管理配置的推荐方法是设置 Spark 配置文件。您也可以使用注入的 ctx
参数直接从转换中进行设置:
@transform(
tgt=Output(...),
)
def compute(ctx, tgt, ...):
df = ...
# Prevent sort with partitioned write
ctx.spark_session.conf.set('spark.sql.optimizer.plannedWrite.enabled', False)
tgt.write_dataframe(df, partition_cols=['col1']))