Я пытаюсь написать такой Dataframe в Parquet:
| foo | bar |
|-----|-------------------|
| 1 | {"a": 1, "b": 10} |
| 2 | {"a": 2, "b": 20} |
| 3 | {"a": 3, "b": 30} |
Я делаю это с помощью Pandas и Fastparquet:
df = pd.DataFrame({
"foo": [1, 2, 3],
"bar": [{"a": 1, "b": 10}, {"a": 2, "b": 20}, {"a": 3, "b": 30}]
})
import fastparquet
fastparquet.write('/my/parquet/location/toy-fastparquet.parq', df)
Я хотел бы загрузить Parquet в (py) Spark и запросить данные с помощью Spark SQL, например:
df = spark.read.parquet("/my/parquet/location/")
df.registerTempTable('my_toy_table')
result = spark.sql("SELECT * FROM my_toy_table WHERE bar.b > 15")
Моя проблема в том, что, хотя fastparquet
может правильно читать свой файл Parquet (поле bar
правильно десериализовано как Struct), в Spark, bar
читается как столбец типа String, который просто содержит JSON-представление исходной структуры:
In [2]: df.head()
Out[2]: Row(foo=1, bar='{"a": 1, "b": 10}')
Я пробовал писать Parquet из PyArrow, но безуспешно: ArrowNotImplementedError: Level generation for Struct not supported yet
. Я также пробовал передать file_scheme='hive'
в Fastparquet, но получил те же результаты. Изменение сериализации Fastparquet на BSON (object_encoding='bson'
) привело к нечитаемому двоичному полю.
[EDIT] я вижу следующие подходы:
- [ответил] Написать Parquet из Spark
- [open] Найдите библиотеку Python, которая реализует Спецификация Parquet для вложенных типов, и это совместимо с тем, как Spark их читает.
- [ответил] Прочтите файлы Fastparquet в Spark с определенной десериализацией JSON (я полагаю, это влияет на производительность)
- Не используйте полностью вложенные структуры
schema
при загрузке данных? - person Cesar A. Mostacero   schedule 14.02.2020