读取 DuckDB 中的分区 parquet 文件

tom*_*zer 6 parquet duckdb

背景

  • DuckDB 允许直接查询 parquet 文件。例如 con.execute("从 'Hierarchy.parquet' 中选择 *)

  • Parquet 允许按列值对文件进行分区。对 parquet 文件进行分区时,将使用 parquet 文件的名称和列值的子文件夹创建顶级文件夹,然后这些子文件夹包含实际的 parquet 数据文件。例如 Hierarchy.parquet(文件夹)--> date=20220401(子文件夹)-->part1.parquet

预期行为

DuckDB 用于查询分区和未分区的 parquet 文件。

观察到的行为

DuckDB 在查询分区的 parquet 文件时失败,但可以处理未分区的 parquet 文件。

con.execute("Select * from 'Hierarchy.parquet'")RuntimeError: IO Error: No files found that match the pattern "Hierarchy.parquet"当 Hierarchy.parquet 分区时失败 。

查询底层个人数据文件工作正常: con.execute("Select * from 'Hierarchy.parquet/date=20220401/part1.parquet'")

有没有办法使用 DuckDB 查询分区的镶木地板文件?或者这是一个限制/错误?

tom*_*zer 6

这作为 DuckDB 问题/功能请求进行了讨论

“支持镶木地板档案的蜂巢式分区” https://github.com/duckdb/duckdb/issues/2186

建议的解决方法是:

  • 使用分区参数将 parquet 文件打开为 arrow/pyarrow 数据集
  • 将数据集注册为 DuckDB 中的视图
  • 查询视图
import pyarrow.dataset as ds
import duckdb

con = duckdb.connect()

dataset = ds.dataset("Hierarchy.parquet", format="parquet", partitioning="hive")
con.register_arrow("Hierarchy", dataset)
con.execute("Select * from Hierarchy").df()
Run Code Online (Sandbox Code Playgroud)

DuckDB 的直接支持会更好......但这工作正常并且很简单。

  • 从 [version 0.3.4](https://github.com/duckdb/duckdb/commit/f05dfff249d3a33608176066273923d79a8824cf) 开始,现在是 `register` 而不是 `register_arrow`。 (4认同)