Delta数据湖upsert调优---1000多列表的调优

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

背景

本文基于
spark 3.1.1
delta 1.0.0
目前在我们公司遇到了一个任务写delta(主要是的upsert操作),写入的时间超过了6个小时,该spark主要的做的事情是:

  1. 一行数据变几百行
  2. 开窗函数去重
  3. 调用pivot函数 行列的转换,该转换以后会存在好多列存在null的情况,导致数据很稀疏

在通过对delta的upsert操作的分析,以及调优后,运行时间直接减少到1.2个小时

分析

上述deltaupsert的操作主要是通过Upsert into a table using merge
实现的,该操作的的具体实现,可以参考delta的MergeIntoCommandrun方法,该方法主要的运行计划如下:

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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值