Запись данных в бакеты S3

В YDB для записи данных в бакет S3 можно использовать внешние источники данных или внешние таблицы.

Запись в S3 через внешний источник данных

Запись данных с помощью внешних источников данных удобно использовать для прототипирования и первоначальной настройки работы с записью данных. В общем виде запрос записи в S3-совместимое хранилище данных с использованием внешнего источника данных выглядит следующим образом:

INSERT INTO
    <s3_external_datasource_name>.<write_folder>
WITH
(
    FORMAT = "<file_format>",
    COMPRESSION = "<compression>",
    SCHEMA = (<schema_definition>),
    <format_settings>
)
    <expression>

Где:

  • s3_external_datasource_name — название внешнего источника данных, ведущего на бакет с S3-совместимого хранилища данных.
  • write_folder — путь к директории внутри бакета, в которую будет вестись запись; путь должен быть не пустым и заканчиваться на /; запись в корень бакета не поддерживается.
  • file_formatформат данных в файлах, обязательно.
  • compressionформат сжатия файлов, опционально.
  • schema_definitionописание схемы хранимых данных в файлах, опционально; если не указано, будет выведено автоматически из типа <expression>.
  • format_settingsпараметры форматирования, опционально.

SQL-выражение иллюстрирует запись данных во внешний источник данных напрямую.

INSERT INTO external_source.`test/`
WITH
(
    FORMAT = "csv_with_names"
)
SELECT
    "value" AS value, "name" AS name

Запись будет произведена в указанный путь, создаваемые при записи файлы получают случайные имена. Для задания партицирования данных нужно использовать PARTITIONED_BY в секции WITH, так же как и при чтении из внешних источников данных, подробнее здесь. Расширенное партицирование не поддерживается для записи в S3. Партицирование данных при записи поддерживается для всех форматов записи, кроме json_list и raw.

При работе с внешними источниками данных и таблицами возможны только операции чтения (SELECT) и вставки (INSERT) данных, другие виды операций не поддерживаются.

Запись данных через внешние таблицы

Если записывать данные нужно регулярно, то удобно делать это с помощью внешних таблиц. При этом нет необходимости указывать все детали работы с этими данными в каждом запросе. Для записи данных в бакет создайте внешнюю таблицу для S3-совместимого хранилища данных и используйте обычное SQL-выражение INSERT INTO:

INSERT INTO test
SELECT
    "value" AS value, "name" AS name

Экспорт данных в объектное хранилище S3

YDB поддерживает экспорт данных из таблиц в S3 с помощью внешнего источника данных.

Для экспорта необходимо использовать запрос записи во внешний источник данных с указанием формата экспортируемых файлов:

INSERT INTO external_source.`test/`
WITH
(
    FORMAT = "parquet"
)
SELECT
    *
FROM table

Экспортировать можно как обычные YDB таблицы, так и любые внешние таблицы.

Совет

Рекомендованным форматом экспорта является parquet, для него оптимизированы сценарии импорта и экспорта.

Для экспорта в S3-совместимое хранилище данных всех таблиц, расположенных в определённой директории в схеме данных, а также информации о расположении таблиц, директорий и индексов таблиц, нужно использовать YDB CLI. Подробнее см. в статье Выгрузка в S3-совместимое хранилище.