DuckDB python API:查询组成

DuckDB python API: query composition

假设我将 DuckDB 与 python 一起使用,用于查询 Apache parquet 文件 test.pq,table 包含两列 f1f2

r1 = duckdb.query("""
SELECT f1 FROM parquet_scan('test.pq') WHERE f2 > 1
""")

现在我想在另一个查询中使用 r1 结果,例如:

duckdb.query("""SELECT * FROM r1 WHERE f1 > 10""")

然而,最后一条指令给出:RuntimeError: Catalog Error: Table with name r1 does not exist!

我是否缺少相当于 Apache Spark registerTempTable() 的 DuckDB 方法?

r1 = duckdb.query("""
SELECT f1 FROM parquet_scan('test.pq') WHERE f2 > 1
""") 

不会创建一个名为 r1 的 table,但实际上会创建一个关系,它只不过是一个执行计划。因此,如果您对其调用执行,实际上会执行扫描镶木地板文件的查询

result = r1.execute()

如果您想将其作为table查询,基本上有两种选择。

  1. 您从您的关系创建视图
r1.create_view('table_name')
  1. 您更改 SQL 查询以创建 duckdb table
conn = duckdb.connect()
conn.execute("create table t as SELECT f1 FROM parquet_scan('test.pq') where f2 > 1 ")

请注意,在 1 中,您实际上会将 parquet 数据加载到 Duck table,而在 2 中,您将不断读取 parquet 数据本身。

最后,如果你只是想堆叠过滤器,那么你可以这样做:

r2 = r1.filter("f1>10")

在 Duckdb 的网站上有更多关于 Python 关系 Api 的信息,更具体地说: https://duckdb.org/docs/api/python

https://github.com/duckdb/duckdb/blob/master/examples/python/duckdb-python.py

希望这对您有所帮助! ;-)