Spark 2.0隐式编码器,当类型为Option [Seq [String]](scala)时处理缺少的列

时间:2017-01-03 23:50:28

标签: scala apache-spark apache-spark-dataset

当我们的数据源中缺少某些类型为Option [Seq [String]]的列时,我在编码数据时遇到了一些问题。理想情况下,我希望用media.svg#location填充缺少的列数据。

情景:

我们正在阅读的一些拼花文件中有 column1 column2

我们将这些镶木地板文件中的数据加载到None,并将其转换为Dataset

MyType
  

org.apache.spark.sql.AnalysisException:无法解析' case class MyType(column1: Option[String], column2: Option[Seq[String]]) sqlContext.read.parquet("dataSource.parquet").as[MyType] '给定输入列:[column1];

有没有办法创建数据集,其中column2数据为column2

1 个答案:

答案 0 :(得分:6)

在简单的情况下,您可以提供初始架构,它是预期架构的超集。例如,在您的情况下:

val schema = Seq[MyType]().toDF.schema

Seq("a", "b", "c").map(Option(_))
  .toDF("column1")
  .write.parquet("/tmp/column1only")

val df = spark.read.schema(schema).parquet("/tmp/column1only").as[MyType]
df.show
+-------+-------+
|column1|column2|
+-------+-------+
|      a|   null|
|      b|   null|
|      c|   null|
+-------+-------+
df.first
MyType = MyType(Some(a),None)

这种方法可能有点脆弱所以一般来说你应该使用SQL文字填充空白:

spark.read.parquet("/tmp/column1only")
  // or ArrayType(StringType)
  .withColumn("column2", lit(null).cast("array<string>"))
  .as[MyType]
  .first
MyType = MyType(Some(a),None)