是否可以将dask/pandas DataFrame写入parquet并返回bytes字符串?我知道这是不可能的to_parquet()函数接受文件路径。也许你有其他的方法。如果不可能做这样的事情,添加这样的功能有意义吗?理想情况下,它应该是这样的:
to_parquet()
parquet_bytes = df.to_parquet() # bytes string is returned
谢谢!
ldfqzlk81#
已经有工作进行,以允许这样的事情,但它不是目前一行的事情,像你建议。首先,如果你有可以容纳在内存中的数据,你可以使用fastparquet的write()方法,并提供一个open=参数。这必须是一个以二进制写入模式创建类似文件的对象的函数,在您的例子中,BytesIO()就可以了。要直接使用dask实现这一点,可以使用filesystem_spec项目中的the MemoryFileSystem。你需要将这个类添加到Dask中,并编写如下:
write()
open=
BytesIO()
dask.bytes.core._filesystems['memory'] = fsspec.implementations.memory.MemoryFileSystem df.to_parquet('memory://name.parquet')
完成后,MemoryFileSystem.store,这是一个类属性,将包含类似文件名的键,以及包含数据的BytesIO对象的值。
MemoryFileSystem.store
dsekswqp2#
如果你的dataframe里面有一个Pandas dataframe(一个分区),你可以把它写到一个临时目录,然后读取这些字节:
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()
2条答案
按热度按时间ldfqzlk81#
已经有工作进行,以允许这样的事情,但它不是目前一行的事情,像你建议。
首先,如果你有可以容纳在内存中的数据,你可以使用fastparquet的
write()
方法,并提供一个open=
参数。这必须是一个以二进制写入模式创建类似文件的对象的函数,在您的例子中,BytesIO()
就可以了。要直接使用dask实现这一点,可以使用filesystem_spec项目中的the MemoryFileSystem。你需要将这个类添加到Dask中,并编写如下:
完成后,
MemoryFileSystem.store
,这是一个类属性,将包含类似文件名的键,以及包含数据的BytesIO对象的值。dsekswqp2#
如果你的dataframe里面有一个Pandas dataframe(一个分区),你可以把它写到一个临时目录,然后读取这些字节: