PySpark. Объединить схемы, приведя к строке при чтении паркета? - PullRequest
1 голос
/ 23 октября 2019

Я читаю данные из файлов паркета, у которых есть поле типа карты, как показано ниже:

>>> 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

Есть ли способ это исправить? Я вынужден переписать неправильные разделы?

1 Ответ

0 голосов
/ 23 октября 2019

Вы можете применить свою собственную схему к фрейму данных.

Определение схемы

customschema = StructType([
    StructField("col_01", IntegerType()),
    StructField("col_02", StringType()),
    StructField("col_03", DateType())
])

В коде приложения вы можете сделать это, как показано ниже

df = spark.read.csv(filename, header=True, nullValue='NA', schema=customschema)
df.show()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...