Dask DataFrame to_parquet возвращает байты вместо записи в файл
Можно ли записать dask/pandas DataFrame в паркет, а затем вернуть строку байтов? Я знаю, что это невозможно с to_parquet()
функция, которая принимает путь к файлу. Может быть, у вас есть другие способы сделать это. Если нет возможности сделать что-то подобное, имеет ли смысл добавлять такую функциональность? В идеале это должно быть так:
parquet_bytes = df.to_parquet() # bytes string is returned
Спасибо!
2 ответа
Была предпринята работа, чтобы допустить такую вещь, но в настоящее время это не однострочная вещь, как вы предлагаете.
Во-первых, если у вас есть данные, которые могут поместиться в памяти, вы можете использовать fastparquet's write()
метод, и поставьте open=
аргумент. Это должна быть функция, которая создает файловый объект в режиме двоичной записи, в вашем случае BytesIO()
сделал бы.
Чтобы это работало напрямую с dask, вы можете использовать MemoryFileSystem из проекта filesystem_spec. Вам нужно будет добавить класс в Dask и написать следующее:
dask.bytes.core._filesystems['memory'] = fsspec.implementations.memory.MemoryFileSystem
df.to_parquet('memory://name.parquet')
Когда закончите, MemoryFileSystem.store
, который является атрибутом класса, будет содержать ключи, похожие на имена файлов, и значения, которые являются объектами BytesIO, содержащими данные.
Если в вашем фрейме данных есть один фрейм данных Pandas (один раздел), вы можете записать его во временный каталог и прочитать эти байты:
with tempfile.TemporaryDirectory() as tmp:
df = dask.dataframe.from_pandas(data, npartitions=1)
df.to_parquet(Path(tmp), write_index=False, schema=None)
parquet_bytes = Path(tmp, "part.0.parquet").read_bytes()