【问题标题】:Methods for writing Parquet files using Python?使用 Python 编写 Parquet 文件的方法?
【发布时间】:2016-01-01 15:02:09
【问题描述】:

我无法找到允许使用 Python 编写 Parquet 文件的库。如果我可以结合使用 Snappy 或类似的压缩机制,则可以加分。

到目前为止,我发现的唯一方法是使用带有 pyspark.sql.DataFrame Parquet 支持的 Spark。

我有一些脚本需要编写不是 Spark 作业的 Parquet 文件。有什么方法可以在 Python 中编写不涉及pyspark.sql 的 Parquet 文件吗?

【问题讨论】:

  • Parquet格式好像有thirft定义文件不能用这个访问吗?

标签: python apache-spark apache-spark-sql parquet snappy


【解决方案1】:

更新(2017 年 3 月):目前有 2 个库能够编写 Parquet 文件:

  1. fastparquet
  2. pyarrow

它们似乎仍在大力开发中,并且带有许多免责声明(例如不支持嵌套数据),因此您必须检查它们是否支持您需要的一切。

旧答案:

截至 2.2016 年,似乎没有能够编写 Parquet 文件的纯 python 库。

如果您只需要读取 Parquet 文件,则有 python-parquet

作为一种解决方法,您将不得不依赖其他一些过程,例如pyspark.sql(它使用 Py4J 并在 JVM 上运行,因此不能直接从普通 CPython 程序中使用)。

【讨论】:

  • 如果您需要能够将数据附加到现有文件,例如批量写入多个 dfs,fastparquet 就可以了。我在 pyarrow 中找不到任何关于 append 的提及,而且似乎代码还没有准备好(2017 年 3 月)。
【解决方案2】:

fastparquet确实有写支持,这里是一个sn-p来写数据到文件

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

【讨论】:

    【解决方案3】:

    我已经编写了 Python 和 Parquet 的综合指南,重点是利用 Parquet 的三个主要优化:列存储列压缩数据分区。还有第四个优化尚未涵盖,行组,但它们并不常用。在 Python 中使用 Parquet 的方式有 pandas、PyArrow、fastparquet、PySpark、Dask 和 AWS Data Wrangler。

    在此处查看帖子:Python and Parquet Performance In Pandas, PyArrow, fastparquet, AWS Data Wrangler, PySpark and Dask

    【讨论】:

      【解决方案4】:

      将 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.jda.com/efficient-dataframe-storage-with-apache-parquet/

      【讨论】:

        【解决方案5】:

        使用fastparquet,您可以使用snappygzip 压缩将pandas df 写入拼花地板,如下所示:

        确保您已安装以下内容:

        $ conda install python-snappy
        $ conda install fastparquet
        

        做进口

        import pandas as pd 
        import snappy
        import fastparquet
        

        假设你有以下 pandas df

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

        通过snappy 压缩发送df 到镶木地板

        df.to_parquet('df.snap.parquet',compression='snappy')
        

        使用gzip 压缩发送df 到镶木地板

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

        检查:

        将 parquet 读回 pandas df

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

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

        输出:

           col1 col2
        0   1    3
        1   2    4
        

        【讨论】:

          【解决方案6】:

          pyspark 似乎是目前用 python 写出 parquet 的最佳选择。这看起来像是用剑代替针,但目前就是这样。

          • 它支持大多数压缩类型,如 lzo、snappy。 Zstd 支持应该很快就会出现。
          • 具有完整的架构支持(嵌套、结构等)

          只需这样做,pip install pyspark,您就可以开始了。

          https://spark.apache.org/docs/latest/sql-data-sources-parquet.html

          【讨论】:

            【解决方案7】:

            另外两个用于快速 CSV => parquet 转换的 Python 库:

            1. 鸭数据库https://duckdb.org
            2. 极地https://github.com/pola-rs/polars

            可能没有 fastparquet 的所有花里胡哨,但确实快速且易于掌握。

            编辑 Polars 可以使用 Arrows 编写 parquet,它支持新的 parquet 版本和选项: https://arrow.apache.org/docs/python/generated/pyarrow.parquet.write_table.html

            【讨论】:

              猜你喜欢
              • 2023-03-16
              • 1970-01-01
              • 2022-10-03
              • 2019-02-24
              • 1970-01-01
              • 2019-03-26
              • 1970-01-01
              • 2017-09-06
              • 1970-01-01
              相关资源
              最近更新 更多