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. Столбцы #
Имя | Тип | Обязательный | Описание |
---|---|---|---|
name | text | нет | Автоматически сгенерированный UUID (первичный ключ) |
type | text | да | Одно из следующих: S3 для Amazon S3, GCS для Google Cloud Storage, R2 для Cloudflare R2 или Azure для Azure Blob Storage. |
key_id | text | S3, GCS, R2 | «ID»-часть секрета |
secret | text | S3, GCS, R2 | «password»-часть секрета |
session_token | text | нет | Фрагмент сеанса AWS S3 при необходимости для ваших учётных данных |
region | text | только для S3 | Указывает регион вашей корзины (bucket) для AWS S3 |
endpoint | text | нет | Указывает конечную точку S3-совместимой службы, если не используется AWS |
r2_account_id | text | только для R2 | Идентификатор аккаунта для учётных данных при использовании Cloudflare R2 |
use_ssl | boolean | нет | По умолчанию true ; false в основном используется для пользовательских конфигураций minio |
scope | text | нет | Префикс URL, применяемый к этим учётным данным. Используется для выбора между несколькими учётными данными для одной и той же службы |
connection_string | text | только для 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.1text
/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 поддерживает не все типы данных. Существуют следующие известные ограничения:
Типы
enum
не поддерживаются.Тип DuckDB
decimal
не поддерживает широкие диапазоны значений, поддерживаемые типом Postgres Pronumeric
. Чтобы избежать ошибок при конвертации между этими двумя типами данных, внутриnumeric
конвертируется вdouble precision
, если DuckDB не поддерживает требуемый уровень точности. Это может привести к потере точности значений.Тип DuckDB
STRUCT
не поддерживается.Тип DuckDB
timestamp_ns
усекается до микросекунд при конвертации в тип Postgres Protimestamp
, что приводит к потере точности в выводе. Операции над значениемtimestamp_ns
, например сортировка/группировка/сравнение, будут выполняться с полной точностью.Столбы
jsonb
конвертируются в столбцыjson
при чтении из DuckDB, поскольку в DuckDB отсутствует типjsonb
.DuckDB не поддерживает многие функции и операторы Postgres Pro
json
иjsonb
. Вместо них можно использовать функции и операторы DuckDBjson
. За более подробной информацией об этих функциях обратитесь к документации DuckDB.В Postgres Pro тип DuckDB
tinyint
конвертируется вchar
. Это объясняется тем, что Postgres Pro не поддерживает типtinyint
. В результате вместо стандартного числа отображается hex-код.Могут возникать проблемы при преобразовании между многомерными массивами 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[][][];
Для типа
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.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
) возвращает SETOFduckdb.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');
Полезные ресурсы:
Требуются следующие аргументы:
Имя Тип Описание path text или text[] Путь к удалённому хранилищу httpfs или локальному хранилищу (если включено) с Parquet-файлами, которые необходимо прочитать. Путь может содержать шаблон поиска (glob) или массив файлов, которые необходимо прочитать. Необязательные параметры повторяют параметры функции DuckDB
read_parquet
. Чтобы указать дополнительные параметры, используйтеparameter := 'value'
.-
read_csv(path TEXT or TEXT[],
#optional_parameters
) возвращает SETOFduckdb.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');
Полезные ресурсы:
Требуются следующие аргументы:
Имя Тип Описание path text или text[] Путь к удалённому хранилищу httpfs или локальному хранилищу (если включено) с CSV-файлами, которые необходимо прочитать. Путь может содержать шаблон поиска (glob) или массив файлов, которые необходимо прочитать. Необязательные параметры повторяют параметры функции DuckDB
read_csv
. Чтобы указать дополнительные параметры, используйтеparameter := 'value'
.Особенности совместимости:
columns
не поддерживается в настоящее время.nullstr
должен быть массивом (TEXT[]
).
-
read_json(path TEXT or TEXT[],
#optional_parameters
) возвращает SETOFduckdb.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');
Полезные ресурсы:
Требуются следующие аргументы:
Имя Тип Описание path text или text[] Путь к удалённому httpfs или к локальному хранилищу (если включено) с JSON-файлами, которые необходимо прочитать. Путь может содержать шаблон поиска (glob) или массив файлов, которые необходимо прочитать. Необязательные параметры повторяют параметры функции DuckDB
read_json
. Чтобы указать дополнительные параметры, используйтеparameter := 'value'
.Особенности совместимости:
columns
не поддерживается в настоящее время.
-
iceberg_scan(path TEXT,
#optional_parameters
) возвращает SETOFduckdb.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');
Полезные ресурсы:
Требуются следующие аргументы:
Имя Тип Описание path text Путь к удалённому хранилищу httpfs или локальному хранилищу (если включено) с таблицей Iceberg, которую необходимо прочитать. Необязательные параметры повторяют параметры функции DuckDB
iceberg_scan
. Чтобы указать дополнительные параметры, используйтеparameter := 'value'
.Имя Тип По умолчанию Описание allowed_moved_paths boolean false Позволяет убедиться, что было выполнено разрешение пути. Это позволяет сканировать таблицы Iceberg, расположение которых было изменено. mode text ''
metadata_compression_codec text 'none'
skip_schema_inference boolean false version text 'version-hint.text'
version_name_format text 'v%s%s.metadata.json,%s%s.metadata.json'
-
iceberg_metadata(path TEXT,
#optional_parameters
) возвращает SETOFiceberg_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 );
Полезные ресурсы:
Требуются следующие аргументы:
Имя Тип Описание path text Путь к удалённому хранилищу httpfs или локальному хранилищу (если включено) с таблицей Iceberg, которую необходимо прочитать. Необязательные параметры повторяют параметры функции DuckDB
iceberg_metadata
. Чтобы указать дополнительные параметры, используйтеparameter := 'value'
.Имя Тип По умолчанию Описание allowed_moved_paths boolean false Позволяет убедиться, что было выполнено разрешение пути. Это позволяет сканировать таблицы Iceberg, расположение которых было изменено. metadata_compression_codec text 'none'
skip_schema_inference boolean false version text 'version-hint.text'
version_name_format text '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');
Полезные ресурсы:
Требуются следующие аргументы:
Имя Тип Описание path text Путь к удалённому хранилищу 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_name text Имя расширения, которое необходимо установить -
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();