#python #duckdb
Вопрос:
Предположим, я использую DuckDB с python для запроса файла Apache parquet test.pq
с таблицей, содержащей два столбца f1
и f2
.
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!
Мне не хватает метода DuckDB, эквивалентного Apache Spark registerTempTable()
?
Ответ №1:
r1 = duckdb.query("""
SELECT f1 FROM parquet_scan('test.pq') WHERE f2 > 1
""")
Не создает таблицу с именем r1, но фактически создает отношение, которое является не чем иным, как планом выполнения. Следовательно, если вы вызовете выполнение для этого, на самом деле будет выполнен запрос, который сканирует файл parquet
result = r1.execute()
Если вы хотите запросить его в виде таблицы, у вас в основном есть два варианта.
- Вы создаете представление из своего отношения
r1.create_view('table_name')
- Вы изменяете свой SQL-запрос для создания таблицы duckdb
conn = duckdb.connect()
conn.execute("create table t as SELECT f1 FROM parquet_scan('test.pq') where f2 > 1 ")
Обратите внимание, что в 1 вы фактически загрузите данные о паркете в таблицу Duck, в то время как в 2 вы будете постоянно считывать сами данные о паркете.
Наконец, если вы просто хотите сложить фильтры, то вы могли бы сделать:
r2 = r1.filter("f1>10")
Более подробная информация о реляционном Api Python размещена на веб-сайте Duckdb, более конкретно по адресу:
https://duckdb.org/docs/api/python
https://github.com/duckdb/duckdb/blob/master/examples/python/duckdb-python.py
Надеюсь, это было полезно! 😉