/ / Niejawny koder Spark 2.0, radzimy sobie z brakującą kolumną, gdy typ jest Option [Seq [String]] (scala) - scala, apache-spark, apache-spark-dataset

Koder niejawny Spark 2.0, radzić sobie z brakującą kolumną, gdy typ jest Option [Seq [String]] (scala) - scala, apache-spark, apache-spark-dataset

Mam problem z kodowaniem danych, gdy brakuje niektórych kolumn typu Option [Seq [String]] w naszym źródle danych. Idealnie chciałbym, aby brakujące dane kolumny były wypełnione None.

Scenariusz:

Mamy pliki parkietu, które czytamy w tym katalogu column1 ale nie kolumna2.

Wgramy dane z tych plików parkietu do pliku Dataseti rzuć to jako MyType.

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

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

org.apache.spark.sql.AnalysisException: nie można rozwiązać "column2"podane kolumny wejściowe: [kolumna1];

Czy istnieje sposób na utworzenie zestawu danych z danymi kolumna2 jako None?

Odpowiedzi:

4 dla odpowiedzi № 1

W prostych przypadkach możesz podać początkowy schemat będący nadzbiorem oczekiwanych schematów. Na przykład w twoim przypadku:

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)

Takie podejście może być trochę delikatne więc ogólnie powinieneś raczej używać literałów SQL do wypełnienia pustych pól:

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