1

假设我将 DuckDB 与 python 一起使用,用于查询 Apache parquet 文件test.pq,其中包含两列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 等效的 DuckDB 方法registerTempTable()

4

1 回答 1

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

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

result = r1.execute()

如果你想将它作为一个表来查询,你基本上有两种选择。

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

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

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

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

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

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

希望这有帮助!;-)

于 2021-07-30T12:54:32.683 回答