【问题标题】:Read parquet into spark dataset ignoring missing fields [duplicate]将镶木地板读入火花数据集,忽略缺失的字段[重复]
【发布时间】:2017-09-20 02:00:31
【问题描述】:

假设我创建了一个 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]

【问题讨论】:

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


    【解决方案1】:

    在 Spark 中,如果 Dataset 的架构与所需的 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))
    }
    

    【讨论】:

      猜你喜欢
      • 2019-02-19
      • 2018-12-20
      • 2018-09-11
      • 2019-02-11
      • 2020-01-10
      • 2018-06-02
      • 2019-02-09
      • 2016-01-18
      • 1970-01-01
      相关资源
      最近更新 更多