【问题标题】:Python: save pandas data frame to parquet filePython:将熊猫数据框保存到镶木地板文件
【发布时间】:2017-04-25 07:06:16
【问题描述】:

是否可以将 pandas 数据框直接保存到 parquet 文件中? 如果不是,建议的流程是什么?

目的是能够将镶木地板文件发送给另一个团队,他们可以使用 scala 代码读取/打开它。谢谢!

【问题讨论】:

  • 其他团队是否在使用 Spark 或其他一些 Scala 工具?加载 CSV 是 Spark 非常简单
  • 如果你有pyspark,你可以做类似this的事情

标签: python-3.x hdfs parquet


【解决方案1】:

这是对我有用的方法 - 类似于上面 - 但也选择规定压缩类型:

设置测试数据框

df = pd.DataFrame(data={'col1': [1, 2], 'col2': [3, 4]})

将数据框转换为拼花并保存到当前目录

df.to_parquet('df.parquet.gzip', compression='gzip')

读取当前目录下的 parquet 文件,返回 pandas 数据框

pd.read_parquet('df.parquet.gzip')

输出:

    col1    col2
0    1       3
1    2       4

【讨论】:

  • 当我们不使用它的任何东西时,为什么我们需要导入?
【解决方案2】:

是的,pandas 支持以 parquet 格式保存数据帧。

将 pandas 数据帧写入 parquet 的简单方法。

假设,df 是熊猫数据框。我们需要导入以下库。

import pyarrow as pa
import pyarrow.parquet as pq

首先,将数据帧df 写入pyarrow 表中。

# Convert DataFrame to Apache Arrow Table
table = pa.Table.from_pandas(df_image_0)

其次,将table写入parquet文件说file_name.parquet

# Parquet with Brotli compression
pq.write_table(table, 'file_name.parquet')

注意:parquet 文件可以在写入时进一步压缩。以下是流行的压缩格式。

  • Snappy(默认,不需要参数)
  • 压缩包
  • 布罗特里

采用 Snappy 压缩的 Parquet

 pq.write_table(table, 'file_name.parquet')

采用 GZIP 压缩的 Parquet

pq.write_table(table, 'file_name.parquet', compression='GZIP')

使用 Brotli 压缩的 Parquet

pq.write_table(table, 'file_name.parquet', compression='BROTLI')

用不同格式的镶木地板进行比较

参考: https://tech.blueyonder.com/efficient-dataframe-storage-with-apache-parquet/

【讨论】:

    【解决方案3】:

    是的,这是可能的。这是示例代码:

    import pyarrow as pa
    import pyarrow.parquet as pq
    
    df = pd.DataFrame(data={'col1': [1, 2], 'col2': [3, 4]})
    table = pa.Table.from_pandas(df, preserve_index=True)
    pq.write_table(table, 'output.parquet')
    

    【讨论】:

      【解决方案4】:

      Pandas 有一个核心功能to_parquet()。只需将数据框写入 parquet 格式,如下所示:

      df.to_parquet('myfile.parquet')
      

      您仍然需要安装 parquet 库,例如 fastparquet。如果您安装了多个 parquet 库,您还需要指定您希望 pandas 使用哪个引擎,否则将需要安装第一个引擎(如documentation)。例如:

      df.to_parquet('myfile.parquet', engine='fastparquet')
      

      【讨论】:

      【解决方案5】:

      pyarrow 支持存储 pandas 数据帧:

      import pyarrow
      
      pyarrow.Table.from_pandas(dataset)
      

      【讨论】:

        【解决方案6】:

        有一个名为 fastparquet 的包的相对较早的实现 - 它可能是您需要的一个很好的用例。

        https://github.com/dask/fastparquet

        conda install -c conda-forge fastparquet
        

        pip install fastparquet
        
        from fastparquet import write 
        write('outfile.parq', df)
        

        或者,如果你想使用一些文件选项,比如行分组/压缩:

        write('outfile2.parq', df, row_group_offsets=[0, 10000, 20000], compression='GZIP', file_scheme='hive')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-28
          • 1970-01-01
          • 2020-04-20
          • 1970-01-01
          • 1970-01-01
          • 2018-12-01
          • 2022-11-24
          • 1970-01-01
          相关资源
          最近更新 更多