10

Option[Seq[String]] 型のいくつかの列がデータ ソースにない場合、データのエンコードに問題があります。理想的には、欠落している列データを で埋めたいと思いますNone

シナリオ:

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指定された入力列 ' ' を解決できません: [column1];

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

4

1 に答える 1

10

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

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)
于 2017-01-04T00:51:23.640 に答える