4.1. Функции #
- 4.1.1. Функции для чтения OLAP-данных из хранилища
- 4.1.2. Функции JSON
- 4.1.3. Функции для работы с типами-объединениями
- 4.1.4. Функции для работы с ассоциативными массивами
- 4.1.5. Агрегатные функции
- 4.1.6. Функции обработки выборок
- 4.1.7. Функции для работы с типами данных времени
- 4.1.8. Функции администрирования DuckDB
- 4.1.9. Функции управления секретами
- 4.1.2. Функции JSON
По умолчанию функции pgpro_axe установлены в схему public. В настоящее время ALTER EXTENSION не может поместить pgpro_axe в другую схему.
4.1.1. Функции для чтения OLAP-данных из хранилища #
-
read_parquet(path TEXT or TEXT[],#необязательные_параметры) returns SETOFduckdb.row Читает Parquet-файл из хранилища.
Возвращает строки DuckDB. Их можно расширить с помощью
*или выбрать конкретные столбцы с помощью синтаксисаr['имя_столбца']. Чтобы выбрать конкретные столбцы, присвойте вызову функции простой псевдоним, напримерr:Пример 4.1.
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[]Путь к хранилищу с Parquet-файлами, которые необходимо прочитать. Может содержать шаблон поиска (glob) или массив файлов.
Необязательные параметры повторяют параметры функции DuckDB
read_parquet. Чтобы указать дополнительные параметры, используйтепараметр := 'значение'.-
read_csv(path TEXT or TEXT[],#необязательные_параметры) returns SETOFduckdb.row Читает CSV-файл из хранилища.
Возвращает строки DuckDB. Их можно расширить с помощью
*или выбрать конкретные столбцы с помощью синтаксисаr['имя_столбца']. Чтобы выбрать конкретные столбцы, присвойте вызову функции простой псевдоним, напримерr:Пример 4.2.
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[]Путь к хранилищу с CSV-файлами, которые необходимо прочитать. Может содержать шаблон поиска (glob) или массив файлов.
Необязательные параметры повторяют параметры функции DuckDB
read_csv. Чтобы указать дополнительные параметры, используйтепараметр := 'значение'.Примечание
columnsне поддерживается в настоящее время.nullstrдолжен быть массивом (TEXT[])
-
read_json(path TEXT or TEXT[],#необязательные_параметры) returns SETOFduckdb.row Читает JSON-файл из хранилища.
Возвращает строки DuckDB. Их можно расширить с помощью
*или выбрать конкретные столбцы с помощью синтаксисаr['имя_столбца']. Чтобы выбрать конкретные столбцы, присвойте вызову функции простой псевдоним, напримерr:Пример 4.3.
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[]Путь к хранилищу с JSON-файлами, которые необходимо прочитать. Может содержать шаблон поиска (glob) или массив файлов.
Необязательные параметры повторяют параметры функции DuckDB
read_json. Чтобы указать дополнительные параметры, используйтепараметр := 'значение'.Примечание
В настоящее время
columnsне поддерживается.-
iceberg_scan(path TEXT,#необязательные_параметры) returns SETOFduckdb.row Читает таблицу iceberg из хранилища.
Возвращает строки DuckDB. Их можно расширить с помощью
*или выбрать конкретные столбцы с помощью синтаксисаr['имя_столбца']. Чтобы выбрать конкретные столбцы, присвойте вызову функции простой псевдоним, напримерr:Пример 4.4.
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');Чтобы использовать
iceberg_scan, включите расширение iceberg:SELECT duckdb.install_extension('iceberg');Обязательные параметры:
Имя
Тип
Описание
pathtextПуть к хранилищу с таблицей iceberg, которую необходимо прочитать.
Необязательные параметры повторяют параметры функции DuckDB
iceberg_scan. Чтобы указать дополнительные параметры, используйтепараметр := 'значение'.Необязательные параметры:
Имя
Тип
Значение по умолчанию
Описание
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,#необязательные_параметры) returns SETOFiceberg_metadata_record Чтобы использовать
iceberg_metadata, включите расширение iceberg:SELECT duckdb.install_extension('iceberg');Обязательные параметры:
Имя
Тип
Описание
pathtextПуть к хранилищу с таблицей iceberg, которую необходимо прочитать.
Необязательные параметры повторяют параметры функции DuckDB
iceberg_metadata. Чтобы указать дополнительные параметры, используйтепараметр := 'значение'.Необязательные параметры:
Имя
Тип
Значение по умолчанию
Описание
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'-
iceberg_snapshots (path TEXT,#необязательные_параметры) returns SETOFiceberg_snapshot_record Считывает информацию о снимке из таблицы iceberg.
Возвращает метаданные снимка таблицы iceberg. Это может быть полезно для запросов с функцией «путешествия во времени» (time travel) и для изучения истории таблицы.
Пример 4.5.
SELECT * FROM iceberg_snapshots('data/iceberg/table');Чтобы использовать
iceberg_snapshots, включите расширение iceberg:SELECT duckdb.install_extension('iceberg');Обязательные параметры:
Имя
Тип
Описание
pathtextПуть к хранилищу с таблицей iceberg, которую необходимо прочитать.
Необязательные параметры повторяют параметры функции DuckDB
iceberg_snapshots. Чтобы указать дополнительные параметры, используйтепараметр := 'значение'.Необязательные параметры:
Имя
Тип
Значение по умолчанию
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) returns SETOF#duckdb.row Считывает набор данных Delta из хранилища.
Возвращает строки DuckDB. Их можно расширить с помощью
*или выбрать конкретные столбцы с помощью синтаксисаr['имя_столбца']. Чтобы выбрать конкретные столбцы, присвойте вызову функции простой псевдоним, напримерr:Пример 4.6.
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');Чтобы использовать
delta_scan, включите расширение delta:SELECT duckdb.install_extension('delta');Обязательные параметры:
Имя
Тип
Описание
pathtextПуть к хранилищу с набором данных Delta, который необходимо прочитать.
4.1.2. Функции JSON #
pgpro_axe поддерживает все функции и агрегаты JSON DuckDB. Функции JSON/JSONB Postgres Pro не поддерживаются.
4.1.3. Функции для работы с типами-объединениями #
-
union_extract(union_col, tag) returns#duckdb.unresolved_type Извлекает значение из типа-объединения за счёт указания имени тега члена, к которому необходимо получить доступ.
Пример 4.7.
-- Извлечь строковое значение, если объединение содержит строку SELECT union_extract(my_union_column, 'string') FROM my_table; -- Извлечь целочисленное значение из объединения SELECT union_extract(data_field, 'integer') AS extracted_int FROM mixed_data;
Обязательные параметры:
Имя
Тип
Описание
union_colduckdb.union or duckdb.unresolved_typeСтолбец-объединение, из которого необходимо получить значение
tagtextИмя тега извлекаемого члена объединения
-
union_tag(union_col) returns#duckdb.unresolved_type Возвращает имя тега текущего активного члена в типе‑объединении.
Пример 4.8.
-- Получить активный тег для каждой строки SELECT union_tag(my_union_column) AS active_type FROM my_table; -- Отфильтровать строки, используя тег объединения SELECT * FROM my_table WHERE union_tag(data_field) = 'string';
Обязательные параметры:
Имя
Тип
Описание
union_colduckdb.union or duckdb.unresolved_typeСтолбец-объединение, из которого требуется получить тег
4.1.4. Функции для работы с ассоциативными массивами #
-
cardinality(map_col duckdb.map) returns#numeric Возвращает размер ассоциативного массива (количество пар ключ-значение).
Пример 4.9.
-- Получить количество записей в ассоциативном массиве SELECT cardinality(r['map_col']) as size FROM duckdb.query($$ SELECT MAP(['a', 'b', 'c'], [1, 2, 3]) as map_col $$) r; -- Возвращает: 3 -- Пустой ассоциативный массив SELECT cardinality(r['map_col']) as size FROM duckdb.query($$ SELECT MAP([], []) as map_col $$) r; -- Возвращает: 0
Обязательные параметры:
Имя
Тип
Описание
map_colduckdb.mapАссоциативный массив, размер которого необходимо получить
-
element_at(map_col duckdb.map, key duckdb.unresolved_type) returns#duckdb.unresolved_type Возвращает значение по указанному ключу в виде массива.
Пример 4.10.
-- Получить значение для определённого ключа SELECT element_at(r['map_col'], 'a') as value FROM duckdb.query($$ SELECT MAP(['a', 'b'], [1, 2]) as map_col $$) r; -- Возвращает: {1} -- Несуществующий ключ SELECT element_at(r['map_col'], 'c') as value FROM duckdb.query($$ SELECT MAP(['a', 'b'], [1, 2]) as map_col $$) r; -- Возвращает: {}Обязательные параметры:
Имя
Тип
Описание
map_colduckdb.mapАссоциативный массив, из которого необходимо извлечь значение
keyduckdb.unresolved_typeКлюч, для которого необходимо извлечь значение
-
map_concat(map_col duckdb.map, map_col2 duckdb.map) returns#duckdb.map Объединяет два ассоциативных массива. При конфликте ключей значение берётся из последнего ассоциативного массива.
Пример 4.11.
-- Объединить два ассоциативных массива SELECT map_concat(r1['map1'], r2['map2']) as merged FROM duckdb.query($$ SELECT MAP(['a', 'b'], [1, 2]) as map1 $$) r1, duckdb.query($$ SELECT MAP(['b', 'c'], [3, 4]) as map2 $$) r2; -- Возвращает: {a=1, b=3, c=4} -- Примечание: значение 'b' из map2 (3) заменяет значение (2) из map1Обязательные параметры:
Имя
Тип
Описание
map_colduckdb.mapПервый ассоциативный массив для объединения
map_col2duckdb.mapВторой ассоциативный массив для объединения
-
map_contains(map_col duckdb.map, key duckdb.unresolved_type) returns#boolean Проверяет, содержит ли ассоциативный массив указанный ключ.
Пример 4.12.
-- Проверить, существует ли ключ SELECT map_contains(r['map_col'], 'a') as has_key FROM duckdb.query($$ SELECT MAP(['a', 'b'], [1, 2]) as map_col $$) r; -- Возвращает: t (true) -- Проверить отсутствующий ключ SELECT map_contains(r['map_col'], 'c') as has_key FROM duckdb.query($$ SELECT MAP(['a', 'b'], [1, 2]) as map_col $$) r; -- Возвращает: f (false)
Обязательные параметры:
Имя
Тип
Описание
map_colduckdb.mapАссоциативный массив, в котором необходимо проверить ключ
keyduckdb.unresolved_typeКлюч, который необходимо проверить
-
map_contains_entry(map_col duckdb.map, key duckdb.unresolved_type, value duckdb.unresolved_type)#boolean Проверяет, содержит ли ассоциативный массив указанную пару ключ-значение.
Пример 4.13.
-- Проверить наличие пары ключ-значение SELECT map_contains_entry(r['map_col'], 'a', 1) as has_entry FROM duckdb.query($$ SELECT MAP(['a', 'b'], [1, 2]) as map_col $$) r; -- Возвращает: t (true) -- Проверить наличие записи с неправильным значением у существующего ключа SELECT map_contains_entry(r['map_col'], 'a', 2) as has_entry FROM duckdb.query($$ SELECT MAP(['a', 'b'], [1, 2]) as map_col $$) r; -- Возвращает: f (false)
Обязательные параметры:
Имя
Тип
Описание
map_colduckdb.mapАссоциативный массив, в котором необходимо проверить пару ключ-значение
keyduckdb.unresolved_typeКлюч, который необходимо проверить
valueduckdb.unresolved_typeЗначение, которое необходимо проверить
-
map_contains_value(map_col duckdb.map, value duckdb.unresolved_type) returns#boolean Проверяет, содержит ли ассоциативный массив указанное значение.
Пример 4.14.
-- Проверить наличие значения SELECT map_contains_value(r['map_col'], 1) as has_value FROM duckdb.query($$ SELECT MAP(['a', 'b'], [1, 2]) as map_col $$) r; -- Возвращает: t (true) -- Проверить несуществующее значение SELECT map_contains_value(r['map_col'], 3) as has_value FROM duckdb.query($$ SELECT MAP(['a', 'b'], [1, 2]) as map_col $$) r; -- Возвращает: f (false)
Обязательные параметры:
Имя
Тип
Описание
map_colduckdb.mapАссоциативный массив, в котором необходимо проверить значение
valueduckdb.unresolved_typeЗначение, которое необходимо проверить
-
map_entries(map_col duckdb.map) returns#duckdb.struct[] Возвращает массив struct (key, value) для каждой пары ключ-значение в ассоциативном массиве.
Пример 4.15.
-- Получить все пары ключ-значение в виде struct SELECT map_entries(r['map_col']) as entries FROM duckdb.query($$ SELECT MAP(['a', 'b'], [1, 2]) as map_col $$) r; -- Возвращает: {"(a,1)","(b,2)"} -- Получить доступ к отдельным полям типа struct SELECT unnest(map_entries(r['map_col'])) as entry FROM duckdb.query($$ SELECT MAP(['a', 'b'], [1, 2]) as map_col $$) r;Обязательные параметры:
Имя
Тип
Описание
map_colduckdb.mapАссоциативный массив, из которого необходимо извлечь массивы struct
-
map_extract(map_col duckdb.map, key duckdb.unresolved_type) returns#duckdb.unresolved_type Извлекает значение из ассоциативного массива по указанному ключу. Если ключ не существует, возвращает пустой массив.
Пример 4.16.
-- Извлечь значение из ассоциативного массива SELECT map_extract(r['map_col'], 'a') as value FROM duckdb.query($$ SELECT MAP(['a', 'b'], [1, 2]) as map_col $$) r; -- Возвращает: {1} -- Извлечь несуществующий ключ SELECT map_extract(r['map_col'], 'c') as value FROM duckdb.query($$ SELECT MAP(['a', 'b'], [1, 2]) as map_col $$) r; -- Возвращает: {}Обязательные параметры:
Имя
Тип
Описание
map_colduckdb.mapАссоциативный массив, из которого необходимо извлечь значение
keyduckdb.unresolved_typeКлюч, который необходимо использовать для извлечения значения
-
map_extract_value(map_col duckdb.map, key duckdb.unresolved_type) returns#duckdb.unresolved_type Возвращает значение для указанного ключа или NULL, если ключ отсутствует в ассоциативном массиве.
Пример 4.17.
-- Извлечь одно значение (не в виде массива) SELECT map_extract_value(r['map_col'], 'a') as value FROM duckdb.query($$ SELECT MAP(['a', 'b'], [1, 2]) as map_col $$) r; -- Возвращает: 1 -- Несуществующий ключ возвращает значение NULL SELECT map_extract_value(r['map_col'], 'c') as value FROM duckdb.query($$ SELECT MAP(['a', 'b'], [1, 2]) as map_col $$) r; -- Возвращает: NULL
Обязательные параметры:
Имя
Тип
Описание
map_colduckdb.mapАссоциативный массив, из которого необходимо извлечь значение
keyduckdb.unresolved_typeКлюч, для которого необходимо извлечь значение
-
map_from_entries(entries duckdb.struct[]) returns#duckdb.map Создаёт ассоциативный массив из массива struct (k, v).
Пример 4.18.
-- Создать ассоциативный массив из массива данных типа struct SELECT map_from_entries(r['entries']) as new_map FROM duckdb.query($$ SELECT [{'k': 'a', 'v': 1}, {'k': 'b', 'v': 2}] as entries $$) r; -- Возвращает: {a=1, b=2} -- Операция, обратная map_entries SELECT map_from_entries(map_entries(r['map_col'])) as reconstructed FROM duckdb.query($$ SELECT MAP(['x', 'y'], [10, 20]) as map_col $$) r; -- Возвращает: {x=10, y=20}Обязательные параметры:
Имя
Тип
Описание
entriesduckdb.struct[]Массив значений struct с полями 'k' (ключ) и 'v' (значение)
-
map_keys(map_col duckdb.map) returns#duckdb.unresolved_type Возвращает все ключи из ассоциативного массива в виде массива.
Пример 4.19.
-- Получить все ключи из ассоциативного массива SELECT map_keys(r['map_col']) as keys FROM duckdb.query($$ SELECT MAP(['a', 'b', 'c'], [1, 2, 3]) as map_col $$) r; -- Возвращает: {a,b,c} -- Пустой ассоциативный массив SELECT map_keys(r['map_col']) as keys FROM duckdb.query($$ SELECT MAP([], []) as map_col $$) r; -- Возвращает: {}Обязательные параметры:
Имя
Тип
Описание
map_colduckdb.mapАссоциативный массив, из которого необходимо извлечь ключи
-
map_values(map_col duckdb.map) returns#duckdb.unresolved_type Возвращает все значения из ассоциативного массива в виде массива.
Пример 4.20.
-- Получить все значения из ассоциативного массива SELECT map_values(r['map_col']) as values FROM duckdb.query($$ SELECT MAP(['a', 'b', 'c'], [1, 2, 3]) as map_col $$) r; -- Возвращает: {1,2,3} -- Пустой ассоциативный массив SELECT map_values(r['map_col']) as values FROM duckdb.query($$ SELECT MAP([], []) as map_col $$) r; -- Возвращает: {}Обязательные параметры:
Имя
Тип
Описание
map_colduckdb.mapАссоциативный массив, из которого необходимо извлечь значения
4.1.5. Агрегатные функции #
-
approx_count_distinct(expression) returns#BIGINT Приближённо вычисляет количество уникальных элементов с использованием алгоритма HyperLogLog. Это значительно быстрее, чем
COUNT(DISTINCT ...)для больших наборов данных, при этом погрешность остаётся небольшой.Пример 4.21.
-- Приблизительное количество уникальных идентификаторов клиентов SELECT approx_count_distinct(customer_id) FROM orders; -- Сравнить с точным количеством SELECT approx_count_distinct(customer_id) AS approx_distinct, COUNT(DISTINCT customer_id) AS exact_distinct FROM orders;Обязательные параметры:
Имя
Тип
Описание
expressionanyВыражение, для которого необходимо считать уникальные значения
4.1.6. Функции обработки выборок #
-
TABLESAMPLE (sampling_method(percentage | rows))# Выбирает подмножество строк из аналитической таблицы или результата запроса. Репрезентативные выборки используются для анализа больших наборов данных, а также для повышения производительности запросов при исследовательском анализе данных.
Пример 4.22.
-- Выбрать 10% строк из таблицы SELECT * FROM large_table TABLESAMPLE SYSTEM(10); -- Выбрать примерно 1000 строк SELECT * FROM events TABLESAMPLE SYSTEM(1000 ROWS); -- Выбрать из файлов озера данных SELECT * FROM read_parquet('s3://datalake/**/*.parquet') TABLESAMPLE SYSTEM(5); -- Использовать выборку для быстрого анализа данных SELECT region, COUNT(*) as sample_count, AVG(revenue) as avg_revenue FROM sales_data TABLESAMPLE SYSTEM(2) GROUP BY region; -- Выбрать из соединений для ускорения SELECT c.name, COUNT(o.id) as order_count FROM customers c JOIN orders o TABLESAMPLE SYSTEM(10) ON c.id = o.customer_id GROUP BY c.name;Методы извлечения выборки:
SYSTEM: случайная выборка на уровне хранилища (быстрее, приблизительный процент).BERNOULLI: построчная случайная выборка (медленнее, точный процент).
Пример 4.23.
-- Системная выборка (рекомендуется для больших таблиц) SELECT * FROM huge_table TABLESAMPLE SYSTEM(1); -- Выборка Bernoulli (точный процент) SELECT * FROM medium_table TABLESAMPLE BERNOULLI(5);
Сценарии использования:
Исследование данных: быстрый анализ больших наборов данных.
Тестирование производительности: проверка запросов на выборочных данных.
Профилирование данных: изучение закономерностей распределения данных.
Разработка ETL-операций: создание конвейеров на выборочных данных.
Проверка качества: контроль качества данных на выборках.
Обязательные параметры:
Имя
Тип
Описание
sampling_methodkeywordSYSTEMилиBERNOULLIpercentagenumericПроцент строк для выборки (0-100)
Необязательные параметры:
Имя
Тип
Описание
rowsintegerПримерное количество строк для выборки (использовать с ключевым словом ROWS)
4.1.7. Функции для работы с типами данных времени #
-
time_bucket(bucket_width INTERVAL, timestamp_col TIMESTAMP, origin TIMESTAMP) returns#TIMESTAMP Группирует временные метки в интервалы для анализа временных рядов. Эта функция совместима с функцией
time_bucketв TimescaleDB, что упрощает миграцию и обеспечивает совместимость.Пример 4.24.
-- Группировать события по часам SELECT time_bucket(INTERVAL '1 hour', created_at) as hour_bucket, COUNT(*) FROM events GROUP BY hour_bucket ORDER BY hour_bucket; -- Группировать с интервалом 15 минут SELECT time_bucket(INTERVAL '15 minutes', timestamp_col), AVG(value) FROM sensor_data WHERE timestamp_col >= '2024-01-01' GROUP BY 1 ORDER BY 1;
Обязательные параметры:
Имя
Тип
Описание
bucket_widthintervalИнтервал времени для группировки (например,
'1 hour','15 minutes')timestamp_coltimestampСтолбец с временными метками для группировки
Необязательные параметры:
Имя
Тип
Описание
origintimestampТочка отсчёта для группировки. Интервалы выровнены относительно этой временной метки.
-
strftime (timestamp_expr, format_string) returns#TEXT Форматирует временные метки в виде строк с использованием стандартных кодов форматирования. Эта функция обеспечивает гибкое форматирование временных меток для отображения и экспорта.
Пример 4.25.
-- Форматировать текущую временную метку SELECT strftime(NOW(), '%Y-%m-%d %H:%M:%S') AS formatted_time; -- Форматировать временные метки в разных форматах SELECT order_id, strftime(created_at, '%Y-%m-%d') AS order_date, strftime(created_at, '%H:%M') AS order_time, strftime(created_at, '%A, %B %d, %Y') AS readable_date FROM orders; -- Использовать для секционирования экспорта в файлы COPY (SELECT * FROM events WHERE event_date = '2024-01-01') TO 's3://bucket/events/' || strftime('2024-01-01'::timestamp, '%Y/%m/%d') || '/events.parquet';Основные коды форматирования:
%Y: четырёхзначный год (2024).%m: месяц в числовом формате (01-12).%d: день месяца (01-31).%H: час (00-23).%M: минута (00-59).%S: секунда (00-59).%A: полное название дня недели (понедельник).%B: полное название месяца (январь).
Необязательные параметры:
Имя
Тип
Описание
timestamp_exprtimestampЗначение временной метки для форматирования
format_stringtextСтрока с кодами форматирования
-
strptime(string_expr, format_string) returns#TIMESTAMP Преобразует строки во временные метки с помощью кодов форматирования.
Пример 4.26.
-- Разобрать строки с датами SELECT strptime('2024-01-15 14:30:00', '%Y-%m-%d %H:%M:%S') AS parsed_timestamp; -- Разобрать разные форматы SELECT strptime('Jan 15, 2024', '%b %d, %Y') AS date1, strptime('15/01/2024', '%d/%m/%Y') AS date2, strptime('2024-01-15T14:30:00Z', '%Y-%m-%dT%H:%M:%SZ') AS iso_date; -- Разобрать временные метки в журнале SELECT log_id, strptime(timestamp_string, '%Y-%m-%d %H:%M:%S') AS parsed_time, message FROM raw_logs;Обязательные параметры:
Имя
Тип
Описание
string_exprtextСтрока для преобразования во временную метку
format_stringtextСтрока форматирования с описанием формата входной строки
-
epoch(timestamp_expr) returns BIGINT# Преобразует временные метки в секунды эпохи Unix (количество секунд, прошедших с 1970-01-01 00:00:00 UTC).
Пример 4.27.
-- Получить текущее время эпохи Unix SELECT epoch(NOW()) AS current_epoch; -- Преобразовать временные метки для использования в API SELECT event_id, epoch(event_timestamp) AS epoch_seconds FROM events; -- Отфильтровать, используя время эпохи Unix SELECT * FROM events WHERE epoch(created_at) > 1640995200; -- After 2022-01-01Обязательные параметры:
Имя
Тип
Описание
map_colduckdb.mapАссоциативный массив, из которого необходимо извлечь параметры
keyduckdb.unresolved_typeКлюч, который необходимо найти в ассоциативном массиве
-
epoch_ms(timestamp_expr) returns#BIGINT Преобразует временные метки в миллисекунды эпохи Unix.
Пример 4.28.
-- Высокоточная временная метка для JavaScript SELECT epoch_ms(NOW()) AS timestamp_ms; -- Для данных временных рядов SELECT sensor_id, epoch_ms(reading_time) AS timestamp_ms, value FROM sensor_readings;Обязательные параметры:
Имя
Тип
Описание
timestamp_exprtimestampВременная метка, которую необходимо преобразовать в миллисекунды эпохи Unix
-
epoch_ms(milliseconds) returns#TIMESTAMP Преобразует миллисекунды эпохи Unix во временную метку.
Пример 4.29.
-- Преобразовать миллисекунды эпохи Unix во временную метку SELECT epoch_ms(1640995200000) AS timestamp_from_ms; -- 2022-01-01 00:00:00 -- Преобразовать сохранённые миллисекунды обратно во временные метки SELECT event_id, epoch_ms(timestamp_ms) AS event_time FROM events;Обязательные параметры:
Имя
Тип
Описание
millisecondsbigintМиллисекунды, прошедшие с начала эпохи Unix
-
epoch_us(timestamp_expr) returns#BIGINT Преобразовывает временные метки в микросекунды эпохи Unix.
Пример 4.30.
-- Временные метки с точностью до микросекунды SELECT epoch_us(NOW()) AS timestamp_us;
Обязательные параметры:
Имя
Тип
Описание
timestamp_exprtimestampВременная метка, которую необходимо преобразовать в микросекунды эпохи Unix
-
epoch_ns(timestamp_expr) returns#BIGINT Преобразовывает временные метки в наносекунды эпохи Unix.
Пример 4.31.
-- Временные метки с точностью до наносекунды SELECT epoch_ns(NOW()) AS timestamp_ns;
Обязательные параметры:
Имя
Тип
Описание
timestamp_exprtimestampВременная метка, которую необходимо преобразовать в наносекунды эпохи Unix
-
make_timestamp(microseconds) returns#TIMESTAMP Создаёт временную метку из микросекунд, прошедших с начала эпохи Unix (1970-01-01 00:00:00 UTC).
Пример 4.32.
-- Создать временную метку из текущего времени в микросекундах эпохи Unix SELECT make_timestamp(epoch_us(NOW())) AS reconstructed_timestamp; -- Создать определённую временную метку SELECT make_timestamp(1640995200000000) AS new_years_2022; -- 2022-01-01 00:00:00
Обязательные параметры:
Имя
Тип
Описание
microsecondsBIGINTМикросекунды, прошедшие с начала эпохи Unix
-
make_timestamptz(microseconds) returns#TIMESTAMPTZ Создаёт временную метку с часовым поясом из микросекунд, прошедших с начала эпохи Unix.
Пример 4.33.
-- Создать timestamptz из текущих микросекунд эпохи SELECT make_timestamptz(epoch_us(NOW())) AS reconstructed_timestamptz; -- Создать конкретную timestamptz SELECT make_timestamptz(1640995200000000) AS new_years_2022_tz;
Обязательные параметры:
Имя
Тип
Описание
microsecondsbigintМикросекунды, прошедшие с начала эпохи Unix
4.1.8. Функции администрирования DuckDB #
-
duckdb.install_extension(extension_name TEXT, repository TEXT DEFAULT 'core') returns#bool Устанавливает расширение DuckDB и включает его автоматическую загрузку в каждом сеансе, который использует pgpro_axe.
Пример 4.34.
SELECT duckdb.install_extension('iceberg'); SELECT duckdb.install_extension('avro', 'community');По умолчанию эта функция может быть вызвана только суперпользователем, так как её можно использовать для загрузки и установки любых расширений. Чтобы позволить вызывать эту функцию другим администраторам, например
my_admin, ему можно выдать следующие права:Пример 4.35.
GRANT ALL ON FUNCTION duckdb.install_extension(TEXT, TEXT) TO my_admin;
Обязательные параметры:
Имя
Тип
Описание
extension_nametextИмя расширения, которое необходимо установить
-
duckdb.load_extension(extension_name TEXT) returns#void Загружает расширение DuckDB только для текущего сеанса. В отличие от функции
duckdb.install_extension, это не настраивает автоматическую загрузку расширения в будущих сеансах.Пример 4.36.
SELECT duckdb.load_extension('iceberg');Обязательные параметры:
Имя
Тип
Описание
extension_nametextИмя загружаемого расширения
-
duckdb.autoload_extension(extension_name TEXT, autoload BOOLEAN) returns#void Указывает, выполняется ли автоматическая загрузка установленного расширения в новых сеансах.
Пример 4.37.
-- Отключить автозагрузку расширения SELECT duckdb.autoload_extension('iceberg', false); -- Включить автозагрузку расширения SELECT duckdb.autoload_extension('iceberg', true);Обязательные параметры:
Имя
Тип
Описание
extension_nametextИмя расширения
autoloadbooleanУказывает, выполняется ли автоматическая загрузка расширения в новых сеансах
-
duckdb.query(query TEXT) returns SETOF#duckdb.row Напрямую выполняет запрос
SELECTк DuckDB. Это может потребоваться, если запрос проще составить в синтаксисе DuckDB или если требуется использовать функцию, которая пока не поддерживается pgpro_axe.Пример 4.38.
В этом запросе
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) returns void# Напрямую выполняет запрос к DuckDB.
В отличие от
duckdb.queryэта функция позволяет выполнять любой запрос, а не толькоSELECT. Основной недостаток заключается в том, что результат запроса записывается в журнал вместо того, чтобы вернуть строки. Рекомендуется по возможности использоватьduckdb.query.-
duckdb.recycle_ddb() returns void# pgpro_axe оставляет экземпляр DuckDB открытым между транзакциями. Это делается для того, чтобы сохранить состояние уровня сеанса, например вручную выполненные команды
SET. Чтобы очистить состояние уровня сеанса, открытый экземпляр DuckDB можно закрыть, вызвав эту функцию.Пример 4.39.
CALL duckdb.recycle_ddb();
4.1.9. Функции управления секретами #
За подробной информацией о секретах обратитесь к Подразделу 3.1.5.
-
duckdb.create_simple_secret(type TEXT, key_id TEXT, secret TEXT, region TEXT,#необязательные_параметры) returnsvoid Создаёт простой секрет для доступа к сервисам облачного хранения данных, таким как S3, GCS или R2.
Пример 4.40.
-- Создать секрет S3 SELECT duckdb.create_simple_secret( type := 'S3', key_id := 'your_access_key', secret := 'your_secret_key', region := 'us-east-1' ); -- Создать секрет S3 с токеном сеанса SELECT duckdb.create_simple_secret( type := 'S3', key_id := 'your_access_key', secret := 'your_secret_key', region := 'us-east-1', session_token := 'your_session_token' );Обязательные параметры:
Имя
Тип
Описание
typetextТип секрета (например,
'S3','GCS','R2')key_idtextИдентификатор ключа доступа или его эквивалент
secrettextСекретный ключ или его эквивалент
Необязательные параметры:
Имя
Тип
Описание
session_tokentextТокен сеанса для временных учётных данных
endpointtextПользовательский URL-адрес конечной точки
url_styletextСтиль URL.
Возможные значения:
'vhost''path'
use_ssltextУказывает, используется ли SSL.
Возможные значения:
true
false
Значение по умолчанию: true.
scopetextОбласть действия секрета.
Значение по умолчанию: ''
regiontextРегион для выбора службы