У меня есть два файла паркета, содержащие вложенные данные с различной схемой. Я хотел бы объединить это. 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