【问题标题】:Transforming a pandas df to a parquet-file-bytes-object将 pandas df 转换为 parquet-file-bytes-object
【发布时间】:2019-06-10 05:25:07
【问题描述】:

我有一个 pandas 数据框,想将它作为 parquet 文件写入 Azure 文件存储。

到目前为止,我还无法将数据帧直接转换为字节,然后我可以将其上传到 Azure。 我目前的解决方法是将其作为 parquet 文件保存到本地驱动器,然后将其作为字节对象读取,我可以将其上传到 Azure。

谁能告诉我如何将 pandas 数据帧直接转换为“parquet 文件”字节对象而不将其写入磁盘? I/O 操作真的让事情变慢了,感觉很像非常丑陋的代码......

# Transform the data_frame into a parquet file on the local drive    
data_frame.to_parquet('temp_p.parquet', engine='auto', compression='snappy')

# Read the parquet file as bytes.
with open("temp_p.parquet", mode='rb') as f:
     fileContent = f.read()

     # Upload the bytes object to Azure
     service.create_file_from_bytes(share_name, file_path, file_name, fileContent, index=0, count=len(fileContent))

我正在寻求实现类似的东西,其中 transform_functionality 返回一个字节对象:

my_bytes = data_frame.transform_functionality()
service.create_file_from_bytes(share_name, file_path, file_name, my_bytes, index=0, count=len(my_bytes))

【问题讨论】:

    标签: python pandas azure pyarrow


    【解决方案1】:

    我找到了解决方案,我会在此处发布,以防有​​人需要执行相同的任务。使用 to_parquet 文件将其写入缓冲区后,我使用 _.getvalue() 功能将字节对象从缓冲区中取出,如下所示:

    buffer = BytesIO()
    data_frame.to_parquet(buffer, engine='auto', compression='snappy')
    
    service.create_file_from_bytes(share_name, file_path, file_name, buffer.getvalue(), index=0, count=buffer.getbuffer().nbytes )
    

    【讨论】:

    • FWIW,在使用 python 3.6.1、pandas 0.24.0、pyarrow 0.9.0 和 fastparquet 0.2.1 进行测试时,此解决方案仅适用于 pyarrow 引擎。使用 fastparquet 可以得到TypeError: expected str, bytes or os.PathLike object, not _io.BytesIO
    • 非常感谢@Cribber!在另一个云服务中遇到了类似的问题,.getvalue() 成功了(经过 2 小时的 stackoverflow..)
    猜你喜欢
    • 1970-01-01
    • 2018-11-30
    • 2017-05-17
    • 1970-01-01
    • 2021-11-03
    • 2020-06-12
    • 2021-11-30
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多