2017-01-03 4 views
4

Option [Seq [String]]型の一部の列が欠落している場合、私たちのデータソース。理想的には、不足している列のデータをNoneで埋めたいと思います。タイプがOption [Seq [String]](scala)の場合、Spark 2.0暗黙のエンコーダが欠落している列を処理する

シナリオ:

私たちは、その持っているcolumn1のなくCOLUMN2に読んでいるいくつかの寄木細工のファイルを持っています。

これらの寄木細工のファイルからデータをDatasetにロードし、MyTypeとしてキャストします。

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

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

org.apache.spark.sql.AnalysisException: 'column2' 与えられた入力列を解決することはできません:[カラム1]。

column2データを持つデータセットをNoneとして作成する方法はありますか?

答えて

3

単純なケースでは、予想されるスキーマのスーパーセットである初期スキーマを提供できます。たとえば、あなたのケースで:

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

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リテラルを使用する必要があります少し壊れやすいことができます

MyType = MyType(Some(a),None) 
関連する問題