DuckDB python API: состав запроса
Предположим, я использую DuckDB с python для запроса паркетного файла Apache.
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, но фактически создает отношение, которое является не чем иным, как планом выполнения. Следовательно, если вы вызовете выполнение для этого, на самом деле будет выполнен запрос, который сканирует файл паркета.
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")
Дополнительную информацию о Python Relational Api можно найти на веб-сайте Duckdb, в частности по адресу: https://duckdb.org/docs/api/python
https://github.com/duckdb/duckdb/blob/master/examples/python/duckdb-python.py
Надеюсь, это было полезно! ;-)