G.3. pgpro_duckdb — возможности и векторно-столбцовый аналитический механизм DuckDB #

pgpro_duckdb — это расширение Postgres Pro, которое интегрирует возможности и векторно-столбцевой аналитический механизм DuckDB в Postgres Pro. pgpro_duckdb является ключевым компонентом Встроенная аналитическая платформа — решения Postgres Pro, которое позволяет работать с OLAP-нагрузками в рамках экземпляра Postgres Pro.

Примечание

В настоящее время расширение pgpro_duckdb находится в экспериментальной фазе.

G.3.1. Установка #

Расширение pgpro_duckdb поставляется вместе с Postgres Pro Enterprise в отдельном пакете pgpro-duckdb-ent-17 (подробные инструкции по установке приведены в Главе 17). Чтобы включить расширение pgpro_duckdb, создайте его с помощью следующего запроса:

CREATE EXTENSION pgpro_duckdb;

По умолчанию известные расширения могут автоматически устанавливаться и запускаться, если они необходимы для выполнения запросов DuckDB. Это поведение можно настроить с помощью параметров duckdb.autoinstall_known_extensions и duckdb.autoload_known_extensions.

Расширения также можно установить вручную. Это может быть полезно, если выключена автоматическая установка / запуск или когда DuckDB не удаётся понять, что для выполнения запроса необходимо расширение. Для установки расширения требуется иметь права суперпользователя.

SELECT duckdb.install_extension('extname');

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

-- установка расширения --
SELECT duckdb.install_extension('iceberg');
-- просмотр установленных расширений --
SELECT * FROM duckdb.extensions;
-- отключение или включение расширения --
UPDATE duckdb.extensions SET enabled = (false|true) WHERE name = 'iceberg';
-- удаление расширения --
DELETE FROM duckdb.extensions WHERE name = 'iceberg';
-- также можно установить расширения сообщества --
SELECT duckdb.install_extension('duckpgq', 'community');

В настоящее время между выключенным и удалённым расширением нет практической разницы.

G.3.2. Поддерживаемые расширения #

pgpro_duckdb поддерживает следующие расширения.

iceberg

Поддержка iceberg позволяет читать таблицы и метаданные iceberg. За списком функций iceberg обратитесь к разделу Подраздел G.3.8.

delta

Поддержка delta позволяет читать файлы delta Lake с помощью delta_scan.

G.3.3. Секреты #

Секреты DuckDB можно настроить в таблице duckdb.secrets, например:

-- фрагмент сеанса необязателен --
INSERT INTO duckdb.secrets
(type, key_id, secret, session_token, region)
VALUES ('S3', 'access_key_id', 'secret_access_key', 'session_token', 'us-east-1');

G.3.3.1. Столбцы #

ИмяТипОбязательныйОписание
nametextнетАвтоматически сгенерированный UUID (первичный ключ)
typetextдаОдно из следующих: S3 для Amazon S3, GCS для Google Cloud Storage, R2 для Cloudflare R2 или Azure для Azure Blob Storage.
key_idtextS3, GCS, R2«ID»-часть секрета
secrettextS3, GCS, R2«password»-часть секрета
session_tokentextнетФрагмент сеанса AWS S3 при необходимости для ваших учётных данных
regiontextтолько для S3Указывает регион вашей корзины (bucket) для AWS S3
endpointtextнетУказывает конечную точку S3-совместимой службы, если не используется AWS
r2_account_idtextтолько для R2Идентификатор аккаунта для учётных данных при использовании Cloudflare R2
use_sslbooleanнетПо умолчанию true; false в основном используется для пользовательских конфигураций minio
scopetextнетПрефикс URL, применяемый к этим учётным данным. Используется для выбора между несколькими учётными данными для одной и той же службы
connection_stringtextтолько для AzureСтрока подключения для Azure

G.3.3.2. Как это работает #

Секреты хранятся в базовой таблице Postgres Pro. Каждый раз, когда pgpro_duckdb создаёт экземпляр DuckDB, а также при изменении секрета, секреты загружаются в менеджер секретов DuckDB как непостоянные.

G.3.3.3. Ограничения #

  • В настоящий момент поддерживаются только перечисленные выше типы секретов. Начиная с версии DuckDB 1.1.3, Postgres Pro, секреты не поддерживаются.

  • Другие поставщики аутентификации, например CHAIN, не поддерживаются.

G.3.4. Транзакции в pgpro_duckdb #

pgpro_duckdb поддерживает транзакции с несколькими операторами. При этом существует одно ограничение, которое необходимо для обеспечения гарантий ACID: в одной транзакции невозможно записывать одновременно в таблицу Postgres Pro и DuckDB.

Аналогичным образом в транзакции можно использовать DDL-команды (например, CREATE/DROP TABLE) с таблицами DuckDB, но при этом подобные операторы нельзя объединять с DDL-командами, которые содержат объекты Postgres Pro.

Кроме того, это ограничение можно полностью отключить и разрешить в одной и той же транзакции запись как в DuckDB, так и в Postgres Pro. Для этого укажите значение true для duckdb.unsafe_allow_mixed_transactions. Однако этого делать не рекомендуется, так как в результате транзакция может быть зафиксирована в DuckDB, но не в Postgres Pro. Это может привести к несогласованности данных или даже их потере. Например, в результате следующего кода duckdb_table может быть удалена, и при этом её содержимое не будет скопировано в pg_table:

BEGIN;
SET LOCAL duckdb.unsafe_allow_mixed_transactions TO true;
CREATE TABLE pg_table AS SELECT * FROM duckdb_table;
DROP TABLE duckdb_table;
COMMIT;

G.3.5. Типы #

pgpro_duckdb может читать множество типов данных, существующих как в Postgres Pro, так и в DuckDB. В настоящий момент в запросах можно использовать следующие типы данных:

  • Целочисленные типы (integer, bigint и т.д.)

  • Типы с плавающей точкой (real, double precision)

  • numeric (внутри может быть конвертирован в double precision, за более подробной информацией обратитесь к разделу с ограничениями ниже: Подраздел G.3.5.1

  • text/varchar/bpchar

  • bit-типы, включая битовые массивы фиксированных и различающихся размеров

  • bytea/blob

  • timestamp/timstampz/date/interval/timestamp_ns/timestamp_ms/timestamp_s

  • boolean

  • uuid

  • json/jsonb

  • domain

  • arrays для всех типов выше, но обратите внимание на ограничения многомерных массивов ниже

G.3.5.1. Известные ограничения #

В настоящее время pgpro_duckdb поддерживает не все типы данных. Существуют следующие известные ограничения:

  1. Типы enum не поддерживаются.

  2. Тип DuckDB decimal не поддерживает широкие диапазоны значений, поддерживаемые типом Postgres Pro numeric. Чтобы избежать ошибок при конвертации между этими двумя типами данных, внутри numeric конвертируется в double precision, если DuckDB не поддерживает требуемый уровень точности. Это может привести к потере точности значений.

  3. Тип DuckDB STRUCT не поддерживается.

  4. Тип DuckDB timestamp_ns усекается до микросекунд при конвертации в тип Postgres Pro timestamp, что приводит к потере точности в выводе. Операции над значением timestamp_ns, например сортировка/группировка/сравнение, будут выполняться с полной точностью.

  5. Столбы jsonb конвертируются в столбцы json при чтении из DuckDB, поскольку в DuckDB отсутствует тип jsonb.

  6. DuckDB не поддерживает многие функции и операторы Postgres Pro json и jsonb. Вместо них можно использовать функции и операторы DuckDB json. За более подробной информацией об этих функциях обратитесь к документации DuckDB.

  7. В Postgres Pro тип DuckDB tinyint конвертируется в char. Это объясняется тем, что Postgres Pro не поддерживает тип tinyint. В результате вместо стандартного числа отображается hex-код.

  8. Могут возникать проблемы при преобразовании между многомерными массивами Postgres Pro и вложенными списками DuckDB (LIST) в DuckDB, так как между функциональностями двух баз данных отсутствует полная взаимная поддержка. В частности, в Postgres Pro массивы в столбце могут иметь разное количество измерений, например [1] и [[1], [2]] могут встретиться в одном столбце. Это запрещено в DuckDB, и степень вложенности не может изменяться. С другой стороны, в DuckDB разные списки на одном уровне вложенности могут содержать разное количество элементов, например [[1], [1, 2]]. Это запрещено в Postgres Pro. Таким образом, преобразование между этими типами возможна, только если массивы следуют за подмножеством. Другой возможной проблемой может быть то, что pgpro_duckdb использует метаданные столбцов Postgres Pro для определения количества измерений массива. Так как Postgres Pro не выдаёт ошибку, когда вы добавляете массивы с разными измерениями, возможна ситуация, при которой количество измерений в столбце метаданных не соответствует реальному количеству измерений. Чтобы избежать этого, вам нужно изменить тип столбца:

    -- преобразует столбец в трёхмерную текстовую строку --
     ALTER TABLE s ALTER COLUMN a SET DATA TYPE text[][][];
  9. Для типа domain при выполнении операции INSERT проверка domain проводится Postgres Pro, а не DuckDB. Если выполняется операция SELECT и запрашиваемое поле имеет тип domain, его потребуется преобразовать в соответствующий базовый тип и обработать с помощью DuckDB.

G.3.6. Специальные типы #

В pgpro_duckdb представлено несколько специальных типов Postgres Pro. Эти типы не нужно создавать в явном виде, и их существование никак не влияет на вашу работу, но периодически они могут отображаться в сообщениях об ошибках от Postgres Pro. Ниже приведено объяснение специальных типов:

duckdb.row #

Тип duckdb.row возвращается такими функциями, как read_parquet, read_csv, scan_iceberg и т.д. В зависимости от аргументов эти функции могут возвращать строки с различными столбцами и типами. В настоящее время Postgres Pro не полностью поддерживает эти функции, поэтому они возвращают специальный тип. Чтобы получить столбцы этих строк, необходимо использовать синтаксис «square bracket indexing» (индексация квадратных скобок), как если бы вы хотели получить поле:

SELECT r['id'], r['name'] FROM read_parquet('file.parquet') r WHERE r['age'] > 21;

При использовании SELECT * столбцы этой строки будут расширены, и результат вашего запроса никогда не будет содержать столбцов с типом duckdb.row:

SELECT * FROM read_parquet('file.parquet');

Из-за ограничений Postgres Pro существуют ограничения по использованию функции, которая возвращает duckdb.row в CTE или подзапросе. Основная проблема заключается в том, что pgpro_duckdb не может автоматически назначать нужные псевдонимы выбранным столбцам строки. Поэтому без CTE/подзапроса такой запрос возвращает столбец r[company] как company:

SELECT r['company']
FROM duckdb.query($$ SELECT 'DuckDB Labs' company $$) r;
--    company
-- ─────────────
--  DuckDB Labs

Такой же запрос в подзапросе или CTE просто вернёт столбец как r:

WITH mycte AS (
SELECT r['company']
FROM duckdb.query($$ SELECT 'DuckDB Labs' company $$) r
)
SELECT * FROM mycte;
--       r
-- ─────────────
--  DuckDB Labs

Это можно легко обойти, добавив явный псевдоним столбцу в CTE/подзапросе:

WITH mycte AS (
SELECT r['company'] AS company
FROM duckdb.query($$ SELECT 'DuckDB Labs' company $$) r
)
SELECT * FROM mycte;
--    company
-- ─────────────
--  DuckDB Labs

Другим ограничением является то, что если при использовании SELECT * в CTE/подзапросе необходимо указать конкретный столбец вне CTE/подзапроса, вам всё равно потребуется использовать синтаксис r['colname'] вместо colname. Таким образом, даже если всё работает нормально:

WITH mycte AS (
SELECT *
FROM duckdb.query($$ SELECT 'DuckDB Labs' company $$) r
)
SELECT * FROM mycte;
--    company
-- ─────────────
--  DuckDB Labs

При выполнении следующего запроса произойдёт ошибка:

WITH mycte AS (
SELECT *
FROM duckdb.query($$ SELECT 'DuckDB Labs' company $$) r
)
SELECT * FROM mycte WHERE company = 'DuckDB Labs';
-- ERROR:  42703: column "company" does not exist
-- LINE 5: SELECT * FROM mycte WHERE company = 'DuckDB Labs';
--                                   ^
-- Подсказка:  При использовании таких функций DuckDB, как read_parquet, для использования столбцов потребуется синтаксис r['colname']. Если этот синтаксис уже используется, возможно вы забыли назначить функции псевдоним r.

Это можно легко обойти с помощью синтаксиса r['colname'], например:

> WITH mycte AS (
SELECT *
FROM duckdb.query($$ SELECT 'DuckDB Labs' company $$) r
)
SELECT * FROM mycte WHERE r['company'] = 'DuckDB Labs';
--    company
-- ─────────────
--  DuckDB Labs
duckdb.unresolved_type #

Тип duckdb.unresolved_type используется, чтобы позволить Postgres Pro понять выражение, содержащее тип, который неизвестен в момент разбора запроса. Это может быть тип любого столбца, извлечённого из duckdb.row с помощью синтаксиса r['mycol']. Многие операторы и агрегатные функции возвращают duckdb.unresolved_type, если одна из сторон оператора имеет тип duckdb.unresolved_type, например r['age'] + 10.

При выполнении запроса DuckDB указывает реальный тип, поэтому результат запроса никогда не содержит столбцов с типом duckdb.unresolved_type. В большинстве случаев пользователь не знает о существовании такого типа.

Вы можете столкнуться с ошибками, в которых сообщается о том, что определённые функции и операции не существуют для duckdb.unresolved_type, например:

ERROR:  function some_func(duckdb.unresolved_type) does not exist
LINE 6:  some_func(r['somecol']) as somecol

В таких случаях обходное решение — добавить явное преобразование в принимаемый функцией тип, например some_func(r['somecol']::text) as somecol.

duckdb.json #

Тип duckdb.json используется для аргументов JSON-функций DuckDB. Он позволяет этим функциям принимать значения json, jsonb и duckdb.unresolved_type.

G.3.7. Параметры конфигурации #

Многие из этих параметров используются для настройки конкретных параметров DuckDB.

duckdb.force_execution #

Принудительно выполнять запросы в DuckDB. Это необходимо, только если запрос относится к таблицам Postgres Pro. Если используются только возможности DuckDB, запросы автоматически выполняются в DuckDB. К возможностям DuckDB относится чтение таблиц DuckDB, использование функций DuckDB (например read_parquet), а также выполнение COPY на удалённое хранилище (s3:// и т.д.).

По умолчанию: false

G.3.7.1. Параметры безопасности #

duckdb.postgres_role #

Роль Postgres Pro, которой позволено выполнять запросы в DuckDB и использовать секреты. По умолчанию доступ есть только у суперпользователей. Если этот параметр настроен, но роль не существует в момент выполнения CREATE EXTENSION pgpro_duckdb, она будет создана автоматически. У этой роли будет доступ к секретам DuckDB.

По умолчанию: ""

Доступ: необходимо указать в файле postgresql.conf и перезапустить сервер

duckdb.disabled_filesystems #

Отключает и запрещает доступ к конкретным файловым системам. Этот параметр применяется только к обычным пользователям. Суперпользователи всегда имеют полный доступ ко всем файловым системам. Если в duckdb.postgres_role указан недоверенный пользователь, рекомендуется отключить LocalFileSystem. В противном случае пользователи смогут читать и записывать любые файлы, к которым Postgres Pro имеет доступ.

По умолчанию: "LocalFileSystem"

Доступ: только суперпользователь

duckdb.autoinstall_known_extensions #

Определяет, разрешена ли автоматическая установка расширений, если они необходимы для выполнения запроса DuckDB.

По умолчанию: true

Доступ: только суперпользователь

duckdb.autoload_known_extensions #

Определяет, разрешён ли автоматический запуск расширений, если они необходимы для выполнения запроса DuckDB.

По умолчанию: true

duckdb.allow_community_extensions #

Отключает установку расширений сообщества.

По умолчанию: false

Доступ: только суперпользователь

duckdb.enable_external_access #

Предоставляет DuckDB доступ к внешним хранилищам (например, HTTP, S3 и т.д.). В настоящее время этот параметр недостаточно протестирован, и его отключение может привести ошибкам при работе с функциями pgpro_duckdb.

По умолчанию: true

Доступ: только суперпользователь

G.3.7.2. Параметры управления ресурсами #

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

duckdb.max_memory / duckdb.memory_limit #

Максимальный объём памяти, который DuckDB может использовать в рамках одного подключения Postgres Pro. Этот параметр сравним с параметром Postgres Pro work_mem. Если указана пустая строка, по умолчанию используется 80% оперативной памяти, как в DuckDB.

По умолчанию: "4GB"

Доступ: только суперпользователь

duckdb.threads / duckdb.worker_threads #

Максимальное количество потоков DuckDB для каждого подключения Postgres Pro. -1 означает, что будет использоваться значение по умолчанию DuckDB, то есть количество потоков будет соответствовать количеству процессоров (ЦП).

По умолчанию: -1

Доступ: только суперпользователь

duckdb.max_workers_per_postgres_scan #

Максимальное количество рабочих процессов PostgreSQL, используемых для одного сканирования Postgres Pro. Этот параметр сравним с параметром Postgres Pro max_parallel_workers_per_gather.

По умолчанию: 2

Доступ: общий

G.3.7.3. Параметры для разработчика #

duckdb.allow_unsigned_extensions #

Позволяет DuckDB запускать расширения с неверными или отсутствующими подписями. Этот параметр полезен при разработке расширений DuckDB.

По умолчанию: false

Доступ: только суперпользователь

G.3.8. Функции #

По умолчанию перечисленные ниже функции без схемы устанавливаются в public. Эти функции можно установить в другое расположение с помощью CREATE EXTENSION pgpro_duckdb WITH SCHEMA schema.

В текущее время не поддерживается ALTER EXTENSION pgpro_duckdb WITH SCHEMA schema.

G.3.8.1. Функции Data Lake #

read_parquet(path TEXT or TEXT[], optional_parameters) возвращает SETOF duckdb.row #

Читает Parquet-файл из удалённого (через httpfs) или локального хранилища.

Возвращает строки DuckDB. Их можно расширить с помощью * или выбрать конкретные столбцы с помощью синтаксиса r['mycol']. Чтобы выбрать конкретные столбцы, вызову функции необходимо присвоить простой псевдоним, например r:

SELECT * FROM read_parquet('file.parquet');
SELECT r['id'], r['name'] FROM read_parquet('file.parquet') r WHERE r['age'] > 21;
SELECT COUNT(*) FROM read_parquet('file.parquet');

Полезные ресурсы:

Требуются следующие аргументы:

ИмяТипОписание
pathtext или text[]Путь к удалённому хранилищу httpfs или локальному хранилищу (если включено) с Parquet-файлами, которые необходимо прочитать. Путь может содержать шаблон поиска (glob) или массив файлов, которые необходимо прочитать.

Необязательные параметры повторяют параметры функции DuckDB read_parquet. Чтобы указать дополнительные параметры, используйте parameter := 'value'.

read_csv(path TEXT or TEXT[], optional_parameters) возвращает SETOF duckdb.row #

Читает CSV-файл из удалённого (через httpfs) или локального хранилища.

Возвращает строки DuckDB. Их можно расширить с помощью * или выбрать конкретные столбцы с помощью синтаксиса r['mycol']. Чтобы выбрать конкретные столбцы, вызову функции необходимо присвоить простой псевдоним, например r:

SELECT * FROM read_csv('file.csv');
SELECT r['id'], r['name'] FROM read_csv('file.csv') r WHERE r['age'] > 21;
SELECT COUNT(*) FROM read_csv('file.csv');

Полезные ресурсы:

Требуются следующие аргументы:

ИмяТипОписание
pathtext или text[]Путь к удалённому хранилищу httpfs или локальному хранилищу (если включено) с CSV-файлами, которые необходимо прочитать. Путь может содержать шаблон поиска (glob) или массив файлов, которые необходимо прочитать.

Необязательные параметры повторяют параметры функции DuckDB read_csv. Чтобы указать дополнительные параметры, используйте parameter := 'value'.

Особенности совместимости:

  • columns не поддерживается в настоящее время.

  • nullstr должен быть массивом (TEXT[]).

read_json(path TEXT or TEXT[], optional_parameters) возвращает SETOF duckdb.row #

Читает JSON-файл из удалённого (через httpfs) или локального хранилища.

Возвращает строки DuckDB. Их можно расширить с помощью * или выбрать конкретные столбцы с помощью синтаксиса r['mycol']. Чтобы выбрать конкретные столбцы, вызову функции необходимо присвоить простой псевдоним, например r:

SELECT * FROM read_parquet('file.parquet');
SELECT r['id'], r['name'] FROM read_parquet('file.parquet') r WHERE r['age'] > 21;
SELECT COUNT(*) FROM read_parquet('file.parquet');

Полезные ресурсы:

Требуются следующие аргументы:

ИмяТипОписание
pathtext или text[]Путь к удалённому httpfs или к локальному хранилищу (если включено) с JSON-файлами, которые необходимо прочитать. Путь может содержать шаблон поиска (glob) или массив файлов, которые необходимо прочитать.

Необязательные параметры повторяют параметры функции DuckDB read_json. Чтобы указать дополнительные параметры, используйте parameter := 'value'.

Особенности совместимости:

  • columns не поддерживается в настоящее время.

iceberg_scan(path TEXT, optional_parameters) возвращает SETOF duckdb.row #

Читает таблицу Iceberg из удалённого (через httpfs) или локального хранилища.

Чтобы использовать iceberg_scan, включите расширение iceberg:

SELECT duckdb.install_extension('iceberg');

Возвращает строки DuckDB. Их можно расширить с помощью * или выбрать конкретные столбцы с помощью синтаксиса r['mycol']. Чтобы выбрать конкретные столбцы, вызову функции необходимо присвоить простой псевдоним, например r:

SELECT * FROM iceberg_scan('data/iceberg/table');
SELECT r['id'], r['name'] FROM iceberg_scan('data/iceberg/table') r WHERE r['age'] > 21;
SELECT COUNT(*) FROM iceberg_scan('data/iceberg/table');

Полезные ресурсы:

Требуются следующие аргументы:

ИмяТипОписание
pathtextПуть к удалённому хранилищу httpfs или локальному хранилищу (если включено) с таблицей Iceberg, которую необходимо прочитать.

Необязательные параметры повторяют параметры функции DuckDB iceberg_scan. Чтобы указать дополнительные параметры, используйте parameter := 'value'.

ИмяТипПо умолчаниюОписание
allowed_moved_pathsbooleanfalseПозволяет убедиться, что было выполнено разрешение пути. Это позволяет сканировать таблицы Iceberg, расположение которых было изменено.
modetext''
metadata_compression_codectext'none'
skip_schema_inferencebooleanfalse
versiontext'version-hint.text'
version_name_formattext'v%s%s.metadata.json,%s%s.metadata.json'
iceberg_metadata(path TEXT, optional_parameters) возвращает SETOF iceberg_metadata_record #

Чтобы использовать iceberg_metadata, включите расширение iceberg:

SELECT duckdb.install_extension('iceberg');

Возвращает метаданные таблицы Iceberg. Данные возвращаются в виде набора icerberg_metadata_record, который определяется следующим образом:

CREATE TYPE duckdb.iceberg_metadata_record AS (
  manifest_path TEXT,
  manifest_sequence_number NUMERIC,
  manifest_content TEXT,
  status TEXT,
  content TEXT,
  file_path TEXT
);

Полезные ресурсы:

Требуются следующие аргументы:

ИмяТипОписание
pathtextПуть к удалённому хранилищу httpfs или локальному хранилищу (если включено) с таблицей Iceberg, которую необходимо прочитать.

Необязательные параметры повторяют параметры функции DuckDB iceberg_metadata. Чтобы указать дополнительные параметры, используйте parameter := 'value'.

ИмяТипПо умолчаниюОписание
allowed_moved_pathsbooleanfalseПозволяет убедиться, что было выполнено разрешение пути. Это позволяет сканировать таблицы Iceberg, расположение которых было изменено.
metadata_compression_codectext'none'
skip_schema_inferencebooleanfalse
versiontext'version-hint.text'
version_name_formattext'v%s%s.metadata.json,%s%s.metadata.json'
delta_scan(path TEXT) возвращает SETOF duckdb.row #

Читает набор данных Delta из удалённого (через httpfs) или локального хранилища.

Чтобы использовать delta_scan, включите расширение delta:

SELECT duckdb.install_extension('delta');

Возвращает строки DuckDB. Их можно расширить с помощью * или выбрать конкретные столбцы с помощью синтаксиса r['mycol']. Чтобы выбрать конкретные столбцы, вызову функции необходимо присвоить простой псевдоним, например r:

SELECT * FROM delta_scan('/path/to/delta/dataset');
SELECT r['id'], r['name'] FROM delta_scan('/path/to/delta/dataset') r WHERE r['age'] > 21;
SELECT COUNT(*) FROM delta_scan('/path/to/delta/dataset');

Полезные ресурсы:

Требуются следующие аргументы:

ИмяТипОписание
pathtextПуть к удалённому хранилищу httpfs или локальному хранилищу (если включено) с набором данных Delta, который необходимо прочитать.

G.3.8.2. Функции JSON #

Все агрегатные и JSON-функции DuckDB. Функции JSON/JSONB Postgres Pro не поддерживаются.

G.3.8.3. Функции администрирования DuckDB #

duckdb.install_extension(extension_name TEXT, repository TEXT DEFAULT 'core') returns bool #

Устанавливает расширение DuckDB и включает его автоматический запуск в каждом сеансе, который использует pgpro_duckdb.

SELECT duckdb.install_extension('iceberg');
SELECT duckdb.install_extension('avro', 'community');

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

GRANT ALL ON FUNCTION duckdb.install_extension(TEXT, TEXT) TO my_admin;
GRANT ALL ON TABLE duckdb.extensions TO my_admin;
GRANT ALL ON SEQUENCE duckdb.extensions_table_seq TO my_admin;

Требуются следующие аргументы:

ИмяТипОписание
extension_nametextИмя расширения, которое необходимо установить
duckdb.query(query TEXT) возвращает SETOF duckdb.row #

Напрямую выполняет запрос SELECT к DuckDB. Это может потребоваться, если запрос проще составить в синтаксисе DuckDB или если требуется использовать функцию, которая пока не поддерживается pgpro_duckdb. Например, ниже приведён запрос, в котором FROM помещён перед SELECT и используется списковое включение (list comprehension). Обе эти возможности не поддерживаются Postgres Pro.

SELECT * FROM duckdb.query('FROM range(10) as a(a) SELECT [a for i in generate_series(0, a)] as arr');
duckdb.raw_query(extension_name TEXT) возвращает void #

Напрямую выполняет запрос к DuckDB. В отличие от duckdb.query эта функция позволяет выполнять любой запрос, а не только SELECT. Основной недостаток заключается в том, что результат запроса записывается в журнал вместо того, чтобы вернуть строки. Рекомендуется по возможности использовать duckdb.query, а эту функцию использовать только при необходимости, например, чтобы запустить DDL.

duckdb.recycle_ddb() возвращает void #

pgpro_duckdb оставляет экземпляр DuckDB открытым между транзакциями. Это делается для того, чтобы сохранить состояние уровня сеанса, например вручную выполненные команды SET. Чтобы очистить состояние уровня сеанса, открытый экземпляр DuckDB можно закрыть с помощью следующего запроса:

CALL duckdb.recycle_ddb();