Работа с бакетами S3 (Yandex Object Storage)

При работе с Yandex Object Storage с помощью внешних источников данных удобно выполнять прототипирование, первоначальную настройку подключений к данным.

Пример запроса для чтения данных:

SELECT
  *
FROM
  object_storage.`*.tsv`
WITH
(
  FORMAT = "tsv_with_names",
  SCHEMA =
  (
    ts Uint32,
    action Utf8
  )
);

Список поддерживаемых форматов и алгоритмов сжатия данных для чтения данных в S3 (Yandex Object Storage), приведен в разделе Форматы данных и алгоритмы сжатия.

Модель данных

В Yandex Object Storage данные хранятся в файлах. Для чтения данных необходимо указать формат данных в файлах, сжатие, списки полей. Для этого используется следующее SQL-выражение:

SELECT
  <expression>
FROM
  <object_storage_connection_name>.`<file_path>`
WITH(
  FORMAT = "<file_format>",
  COMPRESSION = "<compression>",
  SCHEMA = (<schema_definition>))
WHERE
  <filter>;

Где:

Описание схемы данных

Описание схемы данных состоит из набора полей:

  • Названия поля.
  • Типа поля.
  • Признака обязательности данных.

Например, схема данных ниже описывает поле схемы с названием Year типа Int32 и требованием наличия этого поля в данных:

Year Int32 NOT NULL

Если поле данных помечено как обязательное, NOT NULL, но это поле отсутствует в обрабатываемом файле, то работа с таким файлом будет завершена с ошибкой. Если поле помечено как необязательное, NULL, то при отсутствии поля в обрабатываемом файле ошибки не возникнет, но поле примет значение NULL. Ключевое слово NULL в необязательных полях является опциональным.

Автоматический вывод схемы данных

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

Примечание

Автоматический вывод схемы доступен для всех форматов данных, кроме raw и json_as_string. Для этих форматов придётся описывать схему данных вручную.

Чтобы включить автоматический вывод схемы, используйте параметр WITH_INFER:

SELECT
  <expression>
FROM
  <object_storage_connection_name>.`<file_path>`
WITH(
  FORMAT = "<file_format>",
  COMPRESSION = "<compression>",
  WITH_INFER = "true")
WHERE
  <filter>;

Где:

  • object_storage_connection_name — название внешнего источника данных, ведущего на S3 бакет (Yandex Object Storage).
  • file_path — путь к файлу или файлам внутри бакета. Поддерживаются wildcards *, подробнее ниже.
  • file_formatформат данных в файлах. Поддерживаются все форматы, кроме raw и json_as_string.
  • compressionформат сжатия файлов.

В результате выполнения такого запроса будут автоматически выведены названия и типы полей.

Форматы путей к данным

В YDB поддерживаются следующие пути к данным:

Формат пути Описание Пример
Путь завершается символом / Путь к каталогу Путь /a адресует все содержимое каталога:
/a/b/c/d/1.txt
/a/b/2.csv
Путь содержит символ макроподстановки * Любые файлы, вложенные в путь Путь /a/*.csv адресует файлы в каталогах:
/a/b/c/1.csv
/a/2.csv
/a/b/c/d/e/f/g/2.csv
Путь не завершается символом / и не содержит символов макроподстановок Путь к отдельному файлу Путь /a/b.csv адресует конкретный файл /a/b.csv

Пример

Пример запроса для чтения данных из S3 (Yandex Object Storage):

SELECT
  *
FROM
  connection.`folder/filename.csv`
WITH(
  FORMAT = "csv_with_names",
  SCHEMA =
  (
    Year Int32,
    Manufacturer Utf8,
    Model Utf8,
    Price Double
  )
);

Где:

  • connection — название внешнего источника данных, ведущего на бакет S3 (Yandex Object Storage).
  • folder/filename.csv — путь к файлу в бакете S3 (Yandex Object Storage).
  • SCHEMA — описание схемы данных в файле.