背景
本文基于
spark 3.1.1
delta 1.0.0
目前在我们公司遇到了一个任务写delta(主要是的upsert操作),写入的时间超过了6个小时,该spark主要的做的事情是:
- 一行数据变几百行
- 开窗函数去重
- 调用pivot函数 行列的转换,该转换以后会存在好多列存在null的情况,导致数据很稀疏
在通过对delta的upsert操作的分析,以及调优后,运行时间直接减少到1.2个小时
分析
上述delta的upsert的操作主要是通过Upsert into a table using merge
实现的,该操作的的具体实现,可以参考delta的MergeIntoCommand的run方法,该方法主要的运行计划如下:
SerializeFromObject [if (assertnotnull(input[0, org.apache.spark.sql.Row, true]).isNullAt) null else staticinvoke(class org.apache.spark.unsafe.types.UTF8String, StringType, fromString, validateexternaltype(getexternalrowfield(assertnotnull(input[0, org.apache.spark.sql.Row, true]), 0, id), StringType), true, false) AS id#5450,
+- MapPartitions org.apache.spark.sql.delta.commands.MergeIntoCommand$$Lambda$4784/570959825@527325c8, obj#5449: org.apache.spark.sql.Row
+- DeserializeToOb

本文介绍了在Spark3.1.1中使用DeltaLake进行Upsert操作遇到的性能问题,主要涉及数据转换、窗口函数、Pivot操作和反射调用。经过分析和优化,运行时间从6小时降低到1.2小时。优化策略包括减少字段更新、调整Pivot函数用法以及考虑将大表拆分为小表以减少反射调用次数。此外,还探讨了改变字段类型以避免反射的可能性。
最低0.47元/天 解锁文章
283

被折叠的 条评论
为什么被折叠?



