Python:将数据集写入为蜂巢分区和集群 parquet 文件(无 JVM)

Python: write dataset as hive-partitioned and clustered parquet files (no JVM)

提问人:conradlee 提问时间:11/14/2023 最后编辑:conradlee 更新时间:11/15/2023 访问量:82

问:

我想编写一个存储在类似 dataframe 的对象(例如 pandas dataframe、duckdb 表、pyarrow 表)中的表,该表采用 proom 分区集群格式。这就是我的意思

  • Hive 分区,即,我可以指定一组分区列,例如 ) 这将导致每个分区的数据被写入不同的路径,例如(year, month, day, foo_col1)year=2024/month=01/day=01/foo_col1=bar_val/
  • 聚类(又名分桶)。我还可以指定一组聚类列,这会将具有相同值的数据并置到每个分区内 parquet 文件中的相邻行。

请注意,要实现聚类,能够按一组列对每个分区中的行进行排序也就足够了。

我可以在 spark(和 pyspark)中通过对数据帧进行排序,然后使用 parquet 写入输出并指定 partitionBy 列来做到这一点。但是,spark 是一个基于 JVM 的框架,我试图避免它。我很想使用像 或 这样的包来实现这一点,它不需要像 java 这样的外部运行时(并且通常具有较低的序列化/反序列化成本。pyarrowpandasduckdb

我尝试在 duckdb 中执行此操作,首先创建一个排序表,然后使用带有相关 hive paritioning 选项。这创建了一个不太正确的 hive-paritioned:在每个单独的文件中,排序似乎得到尊重,但同一 hive 分区中的所有文件都没有遵循排序。这阻止了聚类/桶提供的优化,其中聚类列的所有相同值都显示在分区内的连续行块中。COPY TO

python parquet pyarrow duckdb

评论

0赞 Pascal 11/24/2023
您可以在以下几个步骤中完成此操作:首先对数据进行分区,然后对其进行聚类。分区很简单:arrow.apache.org/docs/python/... 将其与 arrow.apache.org/docs/python/generated/...如果要在单个步骤中完成此操作,则可以在 中具体化表,对其进行聚类,然后存储它。但这可能不适用于大型数据集。pyarrowpyarrowpyarrow

答: 暂无答案