Spec-Zone.ru › DuckDB

SQL в Apache Arrow

DuckDB может выполнять запросы к различным типам объектов Apache Arrow.

Таблицы Apache Arrow

Таблицы Arrow, хранящиеся в локальных переменных, могут быть запрошены так, как будто это обычные таблицы в DuckDB.

import duckdb
import pyarrow as pa

# connect to an in-memory database
con = duckdb.connect()

my_arrow_table = pa.Table.from_pydict({'i': [1, 2, 3, 4],
                                       'j': ["one", "two", "three", "four"]})

# query the Apache Arrow Table "my_arrow_table" and return as an Arrow Table
results = con.execute("SELECT * FROM my_arrow_table WHERE i = 2").arrow()

Наборы данных Apache Arrow

Наборы данных Arrow, хранящиеся как переменные, также могут быть запрошены так, как будто это обычные таблицы. Наборы данных полезны для указания на каталоги файлов Parquet для анализа больших наборов данных. DuckDB будет передавать выборку столбцов и фильтры строк в операцию сканирования набора данных, чтобы в память загружались только необходимые данные.

import duckdb
import pyarrow as pa
import tempfile
import pathlib
import pyarrow.parquet as pq
import pyarrow.dataset as ds

# connect to an in-memory database
con = duckdb.connect()

my_arrow_table = pa.Table.from_pydict({'i': [1, 2, 3, 4],
                                       'j': ["one", "two", "three", "four"]})

# create example Parquet files and save in a folder
base_path = pathlib.Path(tempfile.gettempdir())
(base_path / "parquet_folder").mkdir(exist_ok = True)
pq.write_to_dataset(my_arrow_table, str(base_path / "parquet_folder"))

# link to Parquet files using an Arrow Dataset
my_arrow_dataset = ds.dataset(str(base_path / 'parquet_folder/'))

# query the Apache Arrow Dataset "my_arrow_dataset" and return as an Arrow Table
results = con.execute("SELECT * FROM my_arrow_dataset WHERE i = 2").arrow()

Сканеры Apache Arrow

Сканеры Arrow, хранящиеся как переменные, также могут быть запрошены так, как будто это обычные таблицы. Сканеры считывают данные из набора данных и выбирают определенные столбцы или применяют фильтрацию строк. Это аналогично тому, как DuckDB передает выборку столбцов и фильтры в набор данных Arrow, но использует вместо этого операции вычисления Arrow. Arrow может использовать асинхронный ввод-вывод для быстрого доступа к файлам.

import duckdb
import pyarrow as pa
import tempfile
import pathlib
import pyarrow.parquet as pq
import pyarrow.dataset as ds
import pyarrow.compute as pc

# connect to an in-memory database
con = duckdb.connect()

my_arrow_table = pa.Table.from_pydict({'i': [1, 2, 3, 4],
                                       'j': ["one", "two", "three", "four"]})

# create example Parquet files and save in a folder
base_path = pathlib.Path(tempfile.gettempdir())
(base_path / "parquet_folder").mkdir(exist_ok = True)
pq.write_to_dataset(my_arrow_table, str(base_path / "parquet_folder"))

# link to Parquet files using an Arrow Dataset
my_arrow_dataset = ds.dataset(str(base_path / 'parquet_folder/'))

# define the filter to be applied while scanning
# equivalent to "WHERE i = 2"
scanner_filter = (pc.field("i") == pc.scalar(2))

arrow_scanner = ds.Scanner.from_dataset(my_arrow_dataset, filter = scanner_filter)

# query the Apache Arrow scanner "arrow_scanner" and return as an Arrow Table
results = con.execute("SELECT * FROM arrow_scanner").arrow()

Чтецы пакетов записей Apache Arrow

Чтецы пакетов записей Arrow — это чтец потокового двоичного формата Arrow и могут быть напрямую запрошены как таблицы. Этот потоковый формат полезен при отправке данных Arrow для задач, таких как межпроцессное взаимодействие или взаимодействие между средами выполнения языков.

import duckdb
import pyarrow as pa

# connect to an in-memory database
con = duckdb.connect()

my_recordbatch = pa.RecordBatch.from_pydict({'i': [1, 2, 3, 4],
                                             'j': ["one", "two", "three", "four"]})

my_recordbatchreader = pa.ipc.RecordBatchReader.from_batches(my_recordbatch.schema, [my_recordbatch])

# query the Apache Arrow RecordBatchReader "my_recordbatchreader" and return as an Arrow Table
results = con.execute("SELECT * FROM my_recordbatchreader WHERE i = 2").arrow()

© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/guides/python/sql_on_arrow.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API