Scala中DataFrame执行join后仅选择原主表列是否有简写方法?
Scala Spark DataFrame关联后保留原schema的快捷实现
核心思路是提前缓存原始主表的列名集合,完成关联和字段更新逻辑后,直接按原始列列表选择数据,无需手动枚举所有列。
实现代码
// 提前缓存原始主表的列对象数组 val originalCols = myDF.columns.map(col) myDF = myDF .join(refDF, myDF("Identity") === refDF("RefIdentity"), "inner") // 可在此处批量添加多个withColumn替换校验后的字段 .withColumn("Foo", $"refFoo") // 直接按原始列列表选择,自动过滤所有reference表的列 .select(originalCols: _*)
补充说明
- 该方案对任意列数的DataFrame通用,最终输出的字段顺序、数据类型和原始主表完全一致
- 可在join前对reference表做列裁剪,仅保留关联键和需要用到的校验字段,减少shuffle数据量提升性能,示例如下:
val originalCols = myDF.columns.map(col) myDF = myDF .join( refDF.select("RefIdentity", "refFoo"), // 提前裁剪多余列 myDF("Identity") === refDF("RefIdentity"), "inner" ) .withColumn("Foo", $"refFoo") .select(originalCols: _*)
内容的提问来源于stack exchange,提问作者Blue
相关产品推荐
相关产品推荐

