pig*_*ate 6 scala apache-spark apache-spark-dataset
当我们的数据源中缺少某些类型为Option [Seq [String]]的列时,我在编码数据时遇到了一些问题.理想情况下,我希望填充缺少的列数据None.
场景:
我们正在阅读的一些镶木地板文件中有column1而不是column2.
我们将这些镶木地板文件中的数据加载到a中Dataset,并将其转换为MyType.
case class MyType(column1: Option[String], column2: Option[Seq[String]])
sqlContext.read.parquet("dataSource.parquet").as[MyType]
Run Code Online (Sandbox Code Playgroud)
org.apache.spark.sql.AnalysisException:无法解析'
column2'给定的输入列:[column1];
有没有办法用column2数据创建数据集None?
在简单的情况下,您可以提供初始架构,它是预期架构的超集.例如在你的情况下:
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
Run Code Online (Sandbox Code Playgroud)
+-------+-------+
|column1|column2|
+-------+-------+
| a| null|
| b| null|
| c| null|
+-------+-------+
Run Code Online (Sandbox Code Playgroud)
df.first
Run Code Online (Sandbox Code Playgroud)
MyType = MyType(Some(a),None)
Run Code Online (Sandbox Code Playgroud)
这种方法可能有点脆弱,所以通常你应该使用SQL文字填充空白:
spark.read.parquet("/tmp/column1only")
// or ArrayType(StringType)
.withColumn("column2", lit(null).cast("array<string>"))
.as[MyType]
.first
Run Code Online (Sandbox Code Playgroud)
MyType = MyType(Some(a),None)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1826 次 |
| 最近记录: |