scala - 将架构从一个数据框复制到另一数据框

标签 scala apache-spark dataframe apache-spark-sql

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

数据框架1:

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

数据框2:
Column K | Column B | Column F
   "c"   |    4     |   5.0
   "b"   |    5     |   6.0
   "f"   |    6     |   7.0

所以我想在第二个上应用第一个数据框的架构。因此,所有相同的列均保留。数据框2中不在1中的列将被删除。其他变为“NULL”。

输出
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值。

这就是我遇到的问题,有没有办法将我的值的类型自动转换为模式?

最佳答案

如果模式是平面的,我将仅使用映射到现有模式和select所需的列:

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 - 将架构从一个数据框复制到另一数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36795680/

相关文章:

datetime - 将带有纳秒的字符串转换为spark中的时间戳

r - 每列采样一行,大量缺失数据

python-2.7 - 从 DataFrame 并行计算距离相关性 (dcor)

删除数据框中具有某些 NA 值的特定行

string - Scala 字符串按字符数量递减分割

scala - 如何重用 SBT 模块项目定义

java - 通过隐式向伴生对象添加方法

scala - 如何使用 Scala 将字符串转换为 ASCII

java - 将 Spark 流数据帧写入 MongoDB

azure - 如何将脚本操作添加到 Azure HD Insight 群集