将镶木地板读入spark数据集,忽略缺失的字段

时间:2017-04-23 10:59:41

标签: apache-spark apache-spark-sql parquet apache-spark-dataset apache-spark-2.0

让我们假设我创建了一个镶木地板文件,如下所示:

case class A (i:Int,j:Double,s:String)

var l1 = List(A(1,2.0,"s1"),A(2,3.0,"S2"))

val ds = spark.createDataset(l1)
ds.write.parquet("/tmp/test.parquet")

是否可以将其读入具有不同架构的类型的数据集,其中唯一的区别是几个额外的字段?

例如:

case class B (i:Int,j:Double,s:String,d:Double=1.0)  // d is extra and has a default value 

我有办法让这项工作成功吗? :

val ds2 = spark.read.parquet("/tmp/test.parquet").as[B]

1 个答案:

答案 0 :(得分:4)

在Spark中,如果数据集的架构与所需的U类型不匹配,您可以将selectalias一起使用,或者根据需要重新排列或重命名。这意味着以下代码可以工作:

val ds2 = spark.read.parquet("/tmp/test.parquet").as[B]

需要进行以下修改:

val ds2 = spark.read.parquet("/tmp/test.parquet").withColumn("d", lit(1D)).as[B]

或者,如果无法创建其他列,则可以执行以下操作:

val ds2 = spark.read.parquet("/tmp/test.parquet").map{
  case row => B(row.getInt(0), row.getDouble(1), row.getString(2))
}