提问者:小点点

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


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

场景:

我们正在读取的一些镶木地板文件具有列1但没有列2。

我们将这些拼花文件中的数据加载到Dataset中,并将其转换为MyType

case class MyType(column1: Option[String], column2: Option[Seq[String]])

sqlContext.read.parquet("dataSource.parquet").as[MyType]

org. apache.park.sql.Analysis Exception:给定输入列无法解析'列2':[列1];

有没有办法将第2列数据创建为的数据集?


共1个答案

匿名用户

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

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)