将 parquet 读入 spark 数据集,忽略缺失的字段
Read parquet into spark dataset ignoring missing fields
假设我创建了一个 parquet 文件,如下所示:
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]
在 Spark 中,如果数据集的模式与所需的 U
类型不匹配,您可以使用 select
和 alias
或 as 根据需要重新排列或重命名。这意味着以下代码可以工作:
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))
}
假设我创建了一个 parquet 文件,如下所示:
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]
在 Spark 中,如果数据集的模式与所需的 U
类型不匹配,您可以使用 select
和 alias
或 as 根据需要重新排列或重命名。这意味着以下代码可以工作:
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))
}