4.1. Функции #

По умолчанию функции pgpro_axe установлены в схему public. В настоящее время ALTER EXTENSION не может поместить pgpro_axe в другую схему.

4.1.1. Функции для чтения OLAP-данных из хранилища #

read_parquet(path TEXT or TEXT[], необязательные_параметры) returns SETOF duckdb.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');

Обязательные параметры:

Имя

Тип

Описание

path

text или text[]

Путь к хранилищу с Parquet-файлами, которые необходимо прочитать. Может содержать шаблон поиска (glob) или массив файлов.

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

read_csv(path TEXT or TEXT[], необязательные_параметры) returns SETOF duckdb.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');

Обязательные параметры:

Имя

Тип

Описание

path

text или text[]

Путь к хранилищу с CSV-файлами, которые необходимо прочитать. Может содержать шаблон поиска (glob) или массив файлов.

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

Примечание

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

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

read_json(path TEXT or TEXT[], необязательные_параметры) returns SETOF duckdb.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');

Обязательные параметры:

Имя

Тип

Описание

path

text или text[]

Путь к хранилищу с JSON-файлами, которые необходимо прочитать. Может содержать шаблон поиска (glob) или массив файлов.

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

Примечание

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

iceberg_scan(path TEXT, необязательные_параметры) returns SETOF duckdb.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');

Обязательные параметры:

Имя

Тип

Описание

path

text

Путь к хранилищу с таблицей iceberg, которую необходимо прочитать.

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

Необязательные параметры:

Имя

Тип

Значение по умолчанию

Описание

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, необязательные_параметры) returns SETOF iceberg_metadata_record #

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

SELECT duckdb.install_extension('iceberg');

Обязательные параметры:

Имя

Тип

Описание

path

text

Путь к хранилищу с таблицей iceberg, которую необходимо прочитать.

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

Необязательные параметры:

Имя

Тип

Значение по умолчанию

Описание

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'

iceberg_snapshots (path TEXT, необязательные_параметры) returns SETOF iceberg_snapshot_record #

Считывает информацию о снимке из таблицы iceberg.

Возвращает метаданные снимка таблицы iceberg. Это может быть полезно для запросов с функцией «путешествия во времени» (time travel) и для изучения истории таблицы.

Пример 4.5.

SELECT * FROM iceberg_snapshots('data/iceberg/table');

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

SELECT duckdb.install_extension('iceberg');

Обязательные параметры:

Имя

Тип

Описание

path

text

Путь к хранилищу с таблицей iceberg, которую необходимо прочитать.

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

Необязательные параметры:

Имя

Тип

Значение по умолчанию

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) 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');

Обязательные параметры:

Имя

Тип

Описание

path

text

Путь к хранилищу с набором данных 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_col

duckdb.union or duckdb.unresolved_type

Столбец-объединение, из которого необходимо получить значение

tag

text

Имя тега извлекаемого члена объединения

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_col

duckdb.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_col

duckdb.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_col

duckdb.map

Ассоциативный массив, из которого необходимо извлечь значение

key

duckdb.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_col

duckdb.map

Первый ассоциативный массив для объединения

map_col2

duckdb.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_col

duckdb.map

Ассоциативный массив, в котором необходимо проверить ключ

key

duckdb.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_col

duckdb.map

Ассоциативный массив, в котором необходимо проверить пару ключ-значение

key

duckdb.unresolved_type

Ключ, который необходимо проверить

value

duckdb.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_col

duckdb.map

Ассоциативный массив, в котором необходимо проверить значение

value

duckdb.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_col

duckdb.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_col

duckdb.map

Ассоциативный массив, из которого необходимо извлечь значение

key

duckdb.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_col

duckdb.map

Ассоциативный массив, из которого необходимо извлечь значение

key

duckdb.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}

Обязательные параметры:

Имя

Тип

Описание

entries

duckdb.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_col

duckdb.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_col

duckdb.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;

Обязательные параметры:

Имя

Тип

Описание

expression

any

Выражение, для которого необходимо считать уникальные значения

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_method

keyword

SYSTEM или BERNOULLI

percentage

numeric

Процент строк для выборки (0-100)

Необязательные параметры:

Имя

Тип

Описание

rows

integer

Примерное количество строк для выборки (использовать с ключевым словом 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_width

interval

Интервал времени для группировки (например, '1 hour', '15 minutes')

timestamp_col

timestamp

Столбец с временными метками для группировки

Необязательные параметры:

Имя

Тип

Описание

origin

timestamp

Точка отсчёта для группировки. Интервалы выровнены относительно этой временной метки.

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_expr

timestamp

Значение временной метки для форматирования

format_string

text

Строка с кодами форматирования

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_expr

text

Строка для преобразования во временную метку

format_string

text

Строка форматирования с описанием формата входной строки

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_col

duckdb.map

Ассоциативный массив, из которого необходимо извлечь параметры

key

duckdb.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_expr

timestamp

Временная метка, которую необходимо преобразовать в миллисекунды эпохи 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;

Обязательные параметры:

Имя

Тип

Описание

milliseconds

bigint

Миллисекунды, прошедшие с начала эпохи Unix

epoch_us(timestamp_expr) returns BIGINT #

Преобразовывает временные метки в микросекунды эпохи Unix.

Пример 4.30.

-- Временные метки с точностью до микросекунды
SELECT epoch_us(NOW()) AS timestamp_us;

Обязательные параметры:

Имя

Тип

Описание

timestamp_expr

timestamp

Временная метка, которую необходимо преобразовать в микросекунды эпохи Unix

epoch_ns(timestamp_expr) returns BIGINT #

Преобразовывает временные метки в наносекунды эпохи Unix.

Пример 4.31.

-- Временные метки с точностью до наносекунды
SELECT epoch_ns(NOW()) AS timestamp_ns;

Обязательные параметры:

Имя

Тип

Описание

timestamp_expr

timestamp

Временная метка, которую необходимо преобразовать в наносекунды эпохи 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

Обязательные параметры:

Имя

Тип

Описание

microseconds

BIGINT

Микросекунды, прошедшие с начала эпохи 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;

Обязательные параметры:

Имя

Тип

Описание

microseconds

bigint

Микросекунды, прошедшие с начала эпохи 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_name

text

Имя расширения, которое необходимо установить

duckdb.load_extension(extension_name TEXT) returns void #

Загружает расширение DuckDB только для текущего сеанса. В отличие от функции duckdb.install_extension, это не настраивает автоматическую загрузку расширения в будущих сеансах.

Пример 4.36.

SELECT duckdb.load_extension('iceberg');

Обязательные параметры:

Имя

Тип

Описание

extension_name

text

Имя загружаемого расширения

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

Имя расширения

autoload

boolean

Указывает, выполняется ли автоматическая загрузка расширения в новых сеансах

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, необязательные_параметры) returns void #

Создаёт простой секрет для доступа к сервисам облачного хранения данных, таким как 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'
);

Обязательные параметры:

Имя

Тип

Описание

type

text

Тип секрета (например, 'S3', 'GCS', 'R2')

key_id

text

Идентификатор ключа доступа или его эквивалент

secret

text

Секретный ключ или его эквивалент

Необязательные параметры:

Имя

Тип

Описание

session_token

text

Токен сеанса для временных учётных данных

endpoint

text

Пользовательский URL-адрес конечной точки

url_style

text

Стиль URL.

Возможные значения:

  • 'vhost'

  • 'path'

use_ssltext

Указывает, используется ли SSL.

Возможные значения:

  • true

  • false

Значение по умолчанию: true.

scope

text

Область действия секрета.

Значение по умолчанию: ''

region

text

Регион для выбора службы