pandas Dask DataFrame to_parquet返回字节而不是写入文件

eivgtgni  于 2023-06-04  发布在  其他
关注(0)|答案(2)|浏览(235)

是否可以将dask/pandas DataFrame写入parquet并返回bytes字符串?我知道这是不可能的to_parquet()函数接受文件路径。也许你有其他的方法。如果不可能做这样的事情,添加这样的功能有意义吗?理想情况下,它应该是这样的:

parquet_bytes = df.to_parquet() # bytes string is returned

谢谢!

ldfqzlk8

ldfqzlk81#

已经有工作进行,以允许这样的事情,但它不是目前一行的事情,像你建议。
首先,如果你有可以容纳在内存中的数据,你可以使用fastparquet的write()方法,并提供一个open=参数。这必须是一个以二进制写入模式创建类似文件的对象的函数,在您的例子中,BytesIO()就可以了。
要直接使用dask实现这一点,可以使用filesystem_spec项目中的the MemoryFileSystem。你需要将这个类添加到Dask中,并编写如下:

dask.bytes.core._filesystems['memory']  = fsspec.implementations.memory.MemoryFileSystem
df.to_parquet('memory://name.parquet')

完成后,MemoryFileSystem.store,这是一个类属性,将包含类似文件名的键,以及包含数据的BytesIO对象的值。

dsekswqp

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

相关问题