scala – 将模式从一个数据帧复制到另一个数据帧

我正在尝试将现有数据帧的架构更改为另一个数据帧的架构.

DataFrame 1:

Column A | Column B | Column C | Column D
   "a"   |    1     |   2.0    |   300
   "b"   |    2     |   3.0    |   400
   "c"   |    3     |   4.0    |   500

DataFrame 2:

Column K | Column B | Column F
   "c"   |    4     |   5.0
   "b"   |    5     |   6.0
   "f"   |    6     |   7.0

所以我想在第二个数据帧上应用第一个数据帧的模式.所以所有相同的列都保留下来.数据框2中不在1中的列将被删除.其他人变成“空”.

产量

Column A | Column B | Column C | Column D
 "NULL"  |    4     |   "NULL" |  "NULL"
 "NULL"  |    5     |   "NULL" |  "NULL"
 "NULL"  |    6     |   "NULL" |  "NULL"

所以我找到了一个可能的解决方案:

val schema = df1.schema
val newRows: RDD[Row] = df2.map(row => {
  val values = row.schema.fields.map(s => {
    if(schema.fields.contains(s)){
      row.getAs(s.name).toString
    }else{
      "NULL"
    }
  })
  Row.fromSeq(values)
})
sqlContext.createDataFrame(newRows, schema)}

现在您可以看到这不起作用,因为架构包含String,Int和Double.我的所有行都有String值.

这是我卡住的地方,有没有办法自动将我的值类型转换为架构?

最佳答案
如果架构是平的,我会简单地使用映射到每个现有架构并选择所需的列:

val exprs = df1.schema.fields.map { f => 
  if (df2.schema.fields.contains(f)) col(f.name)
  else lit(null).cast(f.dataType).alias(f.name) 
}

df2.select(exprs: _*).printSchema

// root
//  |-- A: string (nullable = true)
//  |-- B: integer (nullable = false)
//  |-- C: double (nullable = true)
//  |-- D: integer (nullable = true)

转载注明原文:scala – 将模式从一个数据帧复制到另一个数据帧 - 代码日志