схема искрового слияния вложенных паркетных файлов (scala) - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть два файла паркета, содержащие вложенные данные с различной схемой. Я хотел бы объединить это. df.printSchema() после загрузки каждого файла паркета с помощью spark.read.parquet(input_dir) дает мне следующие схемы только с одним отличием в типе данных столбца c:

root
 |-- x: long (nullable = true)
 |-- y: long (nullable = true)
 |-- z: long (nullable = true)
 |-- XX: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- data: struct (nullable = true)
 |    |    |    |-- a: string (nullable = true)
 |    |    |    |-- b: boolean (nullable = true)
 |    |    |    |-- c: boolean (nullable = true)
 |    |    |-- data_2: struct (nullable = true)
 |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |-- ...
 |    |    |-- data_3: array (nullable = true)
 |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |-- ...
 |-- d: long (nullable = true)
 |-- e: string (nullable = true)
 ...
root
 |-- x: long (nullable = true)
 |-- y: long (nullable = true)
 |-- z: long (nullable = true)
 |-- XX: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- data: struct (nullable = true)
 |    |    |    |-- a: string (nullable = true)
 |    |    |    |-- b: boolean (nullable = true)
 |    |    |    |-- c: string (nullable = true)
 |    |    |-- data_2: struct (nullable = true)
 |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |-- ...
 |    |    |-- data_3: array (nullable = true)
 |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |-- ...
 |-- d: long (nullable = true)
 |-- e: string (nullable = true)
 ...

Столбец c должен рассматриваться как String, поэтому я в основном хочу использовать вторую схему для обоих parquet-файлов. Как это объединить?

Включение .option("mergeSchema", "true") при чтении в файле выдает ошибку, как и ожидалось, поскольку типы данных не совпадают. Я также попытался использовать вторую схему для чтения в первом файле партера:

val df = spark.read.schema(secondSchema).parquet(input_dir)

Это работает, но как только я начинаю работать с данными, например, df.show() throws :

java.lang.ClassCastException: org.apache.spark.sql.catalyst.expressions.MutableAny cannot be cast to org.apache.spark.sql.catalyst.expressions.MutableBoolean

...