Я читаю данные из файлов паркета, у которых есть поле типа карты, как показано ниже:
>>> df = spark.read.parquet('path/to/partiton')
>>> df.collect()
Row(field={'a': 'SomeString', 'b': '1234'})
>>> df.printSchema()
field: map (containsNull = true)
|-- key: string
|-- value: string(valueContainsNull = true)
Проблема в том, что в других разделах ключ a
равен None
, в результате чего ключ b
быть прочитанным как long
тип:
>>> df = spark.read.parquet('path/to/otherPartiton')
>>> df.collect()
Row(field={'a': None, 'b': 1234})
>>> df.printSchema()
field: map (containsNull = true)
|-- key: string
|-- value: long(valueContainsNull = true)
Это создает схему конфликта при чтении всех разделов одновременно:
>>> df = spark.read.parquet('path/to/')
>>> df.collect()
SparkException: ... java.lang.UnsupportedOperationException: org.apache.parquet.column.values.dictionary.PlainValuesDictionary$PlainLongDictionary
Я пытаюсь указать схему вручную, как показано ниже:
>>> struct = StructType([ StructField('field', MapType(StringType(), StringType())) ])
>>> df = spark.read.schema(struct).parquet('path/to/')
>>> df.collect()
fails with same error
Есть ли способ это исправить? Я вынужден переписать неправильные разделы?