Коннектор DuckDB#

Коннектор DuckDB позволяет запрашивать и создавать таблицы во внешнем экземпляре DuckDB. Его можно использовать для объединения данных между разными системами, например DuckDB и Hive, или между двумя разными экземплярами DuckDB.
Требования#
Все узлы кластера должны включать
libstdc++, необходимую для JDBC-драйвера DuckDB.Путь к постоянной базе данных DuckDB должен быть одинаковым, доступным на всех узлах кластера и указывать на одно и то же расположение хранилища.
Конфигурация#
Коннектор может запрашивать базу данных DuckDB. Создайте файл свойств каталога,
который указывает коннектор DuckDB, задав connector.name равным duckdb.
Например, чтобы обращаться к базе данных как к каталогу example, создайте
файл etc/catalog/example.properties. Замените свойства подключения в
соответствии с вашей средой:
connector.name=duckdb
connection-url=jdbc:duckdb:<path>
connection-url задает сведения о подключении и параметры, передаваемые
JDBC-драйверу DuckDB. Параметры URL доступны в документации JDBC-драйвера
DuckDB.
<path> должен указывать на существующий постоянный файл базы данных DuckDB.
Например, используйте jdbc:duckdb:/opt/duckdb/trino.duckdb для базы данных,
созданной командой duckdb /opt/duckdb/trino.duckdb. База данных автоматически
содержит схему main и схему information_schema. Используйте схему main
для новых таблиц или создайте новую схему.
При использовании коннектора в кластере Trino путь должен быть согласован на всех узлах и указывать на общее хранилище, чтобы все узлы работали с одной и той же базой данных.
Использование базы данных DuckDB в памяти jdbc:duckdb: не поддерживается.
Рекомендации по защите DuckDB см. в документации DuckDB. Обратите внимание, что Trino подключается к базе данных с помощью JDBC-драйвера и не использует DuckDB CLI.
Несколько серверов DuckDB#
Коннектор DuckDB может обращаться только к одной базе данных внутри экземпляра DuckDB. Поэтому, если у вас несколько серверов DuckDB или нужно подключиться к нескольким серверам DuckDB, необходимо настроить несколько экземпляров коннектора DuckDB.
Сопоставление типов#
Поскольку Trino и DuckDB поддерживают типы, которых нет в другой системе, этот коннектор изменяет некоторые типы при чтении или записи данных. Типы данных могут сопоставляться по-разному в направлениях между Trino и источником данных. В следующих разделах описано сопоставление типов для каждого направления.
Список типов данных DuckDB.
Сопоставление типов DuckDB с типами Trino#
Коннектор сопоставляет типы DuckDB с соответствующими типами Trino согласно следующей таблице:
Тип DuckDB |
Тип Trino |
Примечания |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Точность и масштаб по умолчанию равны (18,3). |
|
|
|
|
|
Другие типы не поддерживаются.
Сопоставление типов Trino с типами DuckDB#
Коннектор сопоставляет типы Trino с соответствующими типами DuckDB согласно следующей таблице:
Тип Trino |
Тип DuckDB |
Примечания |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Другие типы не поддерживаются.
Свойства конфигурации сопоставления типов#
Следующие свойства можно использовать для настройки того, как типы данных из подключенного источника данных сопоставляются с типами данных Trino и как метаданные кэшируются в Trino.
Имя свойства |
Описание |
Значение по умолчанию |
|---|---|---|
|
Настраивает обработку неподдерживаемых типов данных столбцов:
Соответствующее свойство сеанса каталога — |
|
|
Позволяет принудительно сопоставлять списки типов данных, разделенные
запятыми, с неограниченным |
Поддержка SQL#
Коннектор предоставляет доступ на чтение и запись к данным и метаданным в базе данных DuckDB. Помимо глобально доступных операторов и операторов чтения, коннектор поддерживает следующие возможности:
Процедуры#
system.flush_metadata_cache()#
Очищает кэши метаданных JDBC. Например, следующий системный вызов очищает кэши
метаданных для всех схем в каталоге example:
USE example.example_schema;
CALL system.flush_metadata_cache();
system.execute('query')#
Процедура execute позволяет выполнить запрос напрямую в базовом источнике
данных. Запрос должен использовать поддерживаемый синтаксис подключенного
источника данных. Используйте процедуру для доступа к возможностям, которые
недоступны в Trino, или для выполнения запросов, которые не возвращают набор
результатов и поэтому не могут использоваться с транзитной табличной функцией
query или raw_query. Типичные случаи применения — операторы, создающие или
изменяющие объекты и требующие нативных возможностей, таких как ограничения,
значения по умолчанию, автоматическое создание идентификаторов или индексы.
Запросы также могут вызывать операторы, которые вставляют, обновляют или
удаляют данные и не возвращают данных в результате.
Текст запроса не разбирается Trino, а только передается дальше, поэтому он подчиняется только правилам безопасности и контроля доступа базового источника данных.
В следующем примере текущая база данных устанавливается в example_schema
каталога example. Затем в этой схеме вызывается процедура, чтобы удалить
значение по умолчанию из your_column в таблице your_table с помощью
стандартного SQL-синтаксиса в значении параметра query:
USE example.example_schema;
CALL system.execute(query => 'ALTER TABLE your_table ALTER COLUMN your_column DROP DEFAULT');
Убедитесь, что конкретная база данных поддерживает этот синтаксис, и при необходимости адаптируйте его на основе документации конкретной подключенной базы данных и ее версии.
Табличные функции#
Коннектор предоставляет специальные табличные функции для доступа к DuckDB.
query(varchar) -> table#
Функция query позволяет напрямую запрашивать базовую базу данных. Она требует
синтаксис, родной для DuckDB, поскольку весь запрос проталкивается вниз и
обрабатывается в DuckDB. Это может быть полезно для доступа к нативным
возможностям, недоступным в Trino, или для повышения производительности
запросов в ситуациях, когда выполнение запроса нативно может быть быстрее.
Сведения о поддержке SQL в DuckDB, которую можно использовать в запросе, см. в справочнике команд SQL DuckDB и в документации по другим операторам и функциям.
Нативный запрос, переданный базовому источнику данных, должен возвращать таблицу как набор результатов. Проверку и контроль безопасности для таких запросов выполняет только источник данных, используя собственную конфигурацию. Trino не выполняет эти задачи. Используйте транзитные запросы только для чтения данных.
Как простой пример, запросите каталог example и выберите всю таблицу:
SELECT
*
FROM
TABLE(
example.system.query(
query => 'SELECT
*
FROM
tpch.nation'
)
);
Note
Движок запросов не сохраняет порядок результатов этой функции. Если переданный
запрос содержит предложение ORDER BY, результат функции может быть
упорядочен не так, как ожидается.