背景:
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 查询分区的镶木地板文件?或者这是一个限制/错误?
这作为 DuckDB 问题/功能请求进行了讨论
“支持镶木地板档案的蜂巢式分区” https://github.com/duckdb/duckdb/issues/2186。
建议的解决方法是:
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 的直接支持会更好......但这工作正常并且很简单。