Spark 2.4.8中基于id连接不同列名DataFrame的方案求助
Spark 2.4.8 下合并列名不同的DataFrame解决方案
针对你的场景,由于Spark 2.4.8不支持unionByName的allowMissingColumns参数,我们可以手动给两个DataFrame补全缺失列后再执行union操作,具体实现如下:
核心思路
- 提取两个DataFrame的所有列名并集,确保最终结果包含全部列
- 为每个DataFrame添加对方存在但自身缺失的列,用
null填充 - 按统一列顺序选取字段后执行union操作
代码示例
首先模拟你的DataFrame数据:
// 导入依赖包 import org.apache.spark.sql.SparkSession import org.apache.spark.sql.functions.lit val spark = SparkSession.builder().appName("UnionDifferentDFs").getOrCreate() import spark.implicits._ // 创建df1:id、price列 val df1 = Seq( (1, "p1"), (1, "p2"), (2, null) ).toDF("id", "price") // 创建df2:id、count列 val df2 = Seq( (1, "c1"), (1, "c2"), (1, "c3"), (2, "c4") ).toDF("id", "count")
接下来执行合并操作:
// 获取所有列的并集 val allColumns = df1.columns.union(df2.columns).distinct // 给df1补全缺失列 val df1Full = allColumns.foldLeft(df1) { (df, colName) => if (df.columns.contains(colName)) df else df.withColumn(colName, lit(null)) } // 给df2补全缺失列 val df2Full = allColumns.foldLeft(df2) { (df, colName) => if (df.columns.contains(colName)) df else df.withColumn(colName, lit(null)) } // 按统一列序合并 val resultDF = df1Full.select(allColumns.head, allColumns.tail:_*).union( df2Full.select(allColumns.head, allColumns.tail:_*) ) // 查看结果 resultDF.show()
补充说明
- 最终结果会包含
id、price、count三列:df1的行中count为null,df2的行中price为null - 如果需要严格匹配列类型,可以在
lit(null)后添加cast指定类型,比如lit(null).cast(StringType)
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

