Я использую Dask для чтения файла Parquet, созданного PySpark, и один из столбцов представляет собой список словарей (например, array<map<string,string>>'
). Примером df может быть:
import pandas as pd
df = pd.DataFrame.from_records([
(1, [{'job_id': 1, 'started': '2019-07-04'}, {'job_id': 2, 'started': '2019-05-04'}], 100),
(5, [{'job_id': 3, 'started': '2015-06-04'}, {'job_id': 9, 'started': '2019-02-02'}], 540)],
columns=['uid', 'job_history', 'latency']
)
При использовании engine='fastparquet
Dask нормально читает все остальные столбцы, но возвращает столбец None
s для столбца сложного типа. Когда я устанавливаю engine='pyarrow'
, я получаю следующее исключение:
ArrowNotImplementedError: lists with structs are not supported.
Многие поиски в Google показали, что чтение столбца с вложенным массивом просто не поддерживается прямо сейчас, и я не совсем уверен, как лучше всего справиться с этим. Я полагаю, что мои варианты:
- Каким-то образом скажите dask/fastparquet проанализировать столбец, используя стандартную библиотеку
json
. Схема проста, и, если это возможно, она сделает работу. - Посмотрите, смогу ли я повторно запустить задание Spark, которое сгенерировало вывод, и сохранить его как что-то еще, хотя это почти неприемлемое решение, поскольку моя компания везде использует паркет.
- Превратите ключи карты в столбцы и разбейте данные на несколько столбцов с помощью dtype
list
и обратите внимание, что данные в этих столбцах связаны/сопоставляются друг с другом по индексу (например, элементы в idx0
по этим ключам/столбцам все пришли из того же источника). Это бы сработало, но, честно говоря, сердце разбивается :(
Я хотел бы услышать, как другие обошли это ограничение. Моя компания часто использует вложенные массивы в своем паркете, и я бы не хотел из-за этого отказываться от использования Dask.