Миграция с Yandex Query
Важно
С 13 октября 2026 года сервис Yandex Query будет недоступен для новых пользователей.
Текущие пользователи смогут создавать и изменять сущности до 10 ноября 2026 года. После этого сервис перейдет в режим read-only, а 14 декабря 2026 года прекратит работу. Подробнее о сроках и порядке закрытия читайте на странице Закрытие сервиса Yandex Query.
После закрытия Yandex Query вы можете работать с данными одним из следующих способов:
- Прямое чтение из Object Storage. Читайте данные из бакета S3-совместимыми утилитами, библиотеками или вашим приложением.
- Yandex Managed Service for YDB. Выполняйте федеративные запросы к файлам в Object Storage через внешние источники данных и внешние таблицы. Результаты можно записывать в выходной бакет.
Важно
Соединения, привязки к данным и запросы Yandex Query автоматически не переносятся. Создайте их заново по инструкции ниже. Закрытие Yandex Query не затрагивает данные в бакетах Object Storage.
Руководство описывает перенос аналитических запросов. Для потоковых запросов Yandex Query прямого аналога в Yandex Cloud нет.
Как выбрать целевое решение
В разделе приведено краткое сравнение способов работы с данными после закрытия Yandex Query.
|
Сценарий |
Как вы используете Yandex Query |
|
Читаете файлы, например детализацию биллинга в CSV-формате, и обрабатываете их в приложении. |
|
|
Регулярно выполняете аналитические запросы к файлам в бакете, храните тексты запросов в коде или используете привязки к данным. |
|
|
Строите дашборды с частым обновлением или многократно читаете одни и те же данные. |
Выбирайте прямое чтение из Object Storage, если:
- обработка данных уже реализована в вашем приложении;
- запросы простые и не требуют SQL;
- вы читаете файлы нерегулярно или однократно.
Выбирайте федеративные запросы в Yandex Managed Service for YDB, если:
- данные должны оставаться в бакете;
- вы хотите сохранить SQL-запросы и привычную модель работы с внешними данными;
- одни и те же файлы не читаются многократно.
Выбирайте колоночные таблицы в Yandex Managed Service for YDB, если:
- одни и те же данные используются в регулярных запросах или дашбордах;
- важна скорость повторяющихся аналитических запросов;
- вы готовы загружать данные из бакета в базу данных.
Совет
Если вы использовали Yandex Query для SQL-запросов к файлам в Object Storage, начните с федеративных запросов в Yandex Managed Service for YDB. Этот вариант требует меньше изменений в запросах и не требует переносить исходные данные из бакета.
Модели оплаты отличаются. В Yandex Query оплачивается объем данных, прочитанных запросами. При прямом чтении из Object Storage оплачиваются операции и исходящий трафик. В Yandex Managed Service for YDB оплачиваются выделенные вычислительные ресурсы и хранилище базы данных независимо от числа запросов. Подробнее о стоимости ресурсов читайте в разделах Правила тарификации Object Storage и Правила тарификации Yandex Managed Service for YDB.
Прямое чтение из Object Storage
Сценарий подходит, если всю необходимую обработку данных вы выполняете на своей стороне.
Перед началом работы
-
Создайте сервисный аккаунт, от имени которого будет выполняться чтение.
-
Назначьте сервисному аккаунту роль
storage.viewerна бакет или каталог, в котором он находится. -
Создайте статический ключ доступа для сервисного аккаунта.
Сохраните значения
key_idиsecret: секретный ключ больше не будет показан.
Прочитайте данные
-
Настройте AWS CLI с ключом сервисного аккаунта.
-
Посмотрите список файлов:
aws --endpoint-url=https://storage.yandexcloud.net \ s3 ls s3://<имя_бакета>/<префикс>/ -
Скачайте файлы:
aws --endpoint-url=https://storage.yandexcloud.net \ s3 cp s3://<имя_бакета>/<префикс>/ ./data/ --recursive
Пример читает CSV-файлы с заданным префиксом и считает сумму по колонке, как это делал бы запрос SELECT service_name, SUM(cost) ... GROUP BY service_name в Yandex Query. Названия колонок сверьте с заголовком ваших файлов.
import boto3
import pandas as pd
s3 = boto3.client(
"s3",
endpoint_url="https://storage.yandexcloud.net",
aws_access_key_id="<идентификатор_ключа>",
aws_secret_access_key="<секретный_ключ>",
)
frames = []
paginator = s3.get_paginator("list_objects_v2")
for page in paginator.paginate(Bucket="<имя_бакета>", Prefix="<префикс>/"):
for obj in page.get("Contents", []):
if obj["Key"].endswith(".csv"):
body = s3.get_object(Bucket="<имя_бакета>", Key=obj["Key"])["Body"]
frames.append(pd.read_csv(body))
df = pd.concat(frames)
print(df.groupby("service_name")["cost"].sum().sort_values(ascending=False))
Yandex Managed Service for YDB
Соответствие сущностей
|
Yandex Query |
Yandex Managed Service for YDB |
|
Соединение с Object Storage |
Внешний источник данных |
|
Привязка к данным |
Внешняя таблица |
|
Обращение к привязке |
Обращение к внешней таблице по имени: |
|
Аутентификация через сервисный аккаунт |
Статический ключ доступа сервисного аккаунта, сохраненный в секретах |
|
Чтение файлов по маске, партиционирование, |
Поддерживаются с тем же синтаксисом |
|
Форматы |
Поддерживаются |
|
Запись результата в бакет |
Поддерживается с тем же синтаксисом |
|
Соединения с Managed Service for PostgreSQL, Managed Service for ClickHouse®, Managed Service for MySQL® и Yandex MPP Analytics for PostgreSQL |
Федеративные запросы |
|
Потоковые запросы к Yandex Data Streams |
Нет аналога |
|
Соединение с Monitoring |
Нет аналога |
|
Сохраненные запросы |
Храните тексты запросов в своем репозитории |
Перед началом работы
-
Создайте базу данных Yandex Managed Service for YDB с выделенными ресурсами в том же облаке, где находятся бакеты с данными.
Примечание
Внешние источники данных доступны только в базах данных с выделенными ресурсами. В базе данных в режиме Serverless запрос к внешнему источнику завершится ошибкой
External data sources are disabled. -
Назначьте пользователю, который будет переносить запросы, роль
ydb.editorна базу данных. -
Создайте сервисный аккаунт и статический ключ доступа, как описано в разделе Прямое чтение из Object Storage. Если запросы записывают результаты в бакет, дополнительно назначьте сервисному аккаунту роль
storage.uploader. -
Сохраните тексты запросов, параметры соединений и привязок из Yandex Query: имена, пути в бакете, формат, сжатие, схему и настройки партиционирования.
Федеративные запросы: чтение файлов из Object Storage
Сценарий повторяет работу Yandex Query: данные остаются в бакете, база читает их при каждом запросе.
Создайте внешний источник данных
-
Сохраните статический ключ в секретах базы данных:
CREATE SECRET s3_key_id WITH (value = "<идентификатор_ключа>"); CREATE SECRET s3_secret_key WITH (value = "<секретный_ключ>"); -
Создайте внешний источник данных. Чтобы не менять тексты запросов, назовите его так же, как соединение в Yandex Query:
CREATE EXTERNAL DATA SOURCE <имя_соединения> WITH ( SOURCE_TYPE = "ObjectStorage", LOCATION = "https://storage.yandexcloud.net/<имя_бакета>/", AUTH_METHOD = "AWS", AWS_ACCESS_KEY_ID_SECRET_PATH = "s3_key_id", AWS_SECRET_ACCESS_KEY_SECRET_PATH = "s3_secret_key", AWS_REGION = "ru-central1" );Для публичного бакета секреты не нужны: укажите
AUTH_METHOD = "NONE"и не указывайте параметрыAWS_*. -
Проверьте, что база читает бакет:
SELECT * FROM <имя_соединения>.`<путь>/` WITH ( FORMAT = "csv_with_names", WITH_INFER = "true" ) LIMIT 10;
Перенесите привязки к данным
Для каждой привязки создайте внешнюю таблицу с теми же колонками, форматом и сжатием:
CREATE EXTERNAL TABLE <имя_привязки> (
date Date NOT NULL,
service_name Utf8,
cost Double
) WITH (
DATA_SOURCE = "<имя_соединения>",
LOCATION = "<путь>/",
FORMAT = "csv_with_names",
COMPRESSION = "gzip"
);
Если в привязке настроено партиционирование или partition projection, перенесите параметры PARTITIONED_BY и projection.* без изменений.
Перенесите запросы
Запросы к соединениям переносятся без изменений, если имя внешнего источника совпадает с именем соединения. В запросах к привязкам уберите префикс bindings.:
SELECT service_name, SUM(cost) AS total
FROM bindings.`billing`
WHERE date >= Date("2026-09-01")
GROUP BY service_name
ORDER BY total DESC;
SELECT service_name, SUM(cost) AS total
FROM billing
WHERE date >= Date("2026-09-01")
GROUP BY service_name
ORDER BY total DESC;
Запросы можно выполнять в консоли управления, с помощью YDB CLI
ydb \
--endpoint <эндпоинт_базы_данных> \
--database <путь_к_базе_данных> \
sql -s 'SELECT service_name, SUM(cost) AS total FROM billing GROUP BY service_name' \
--format csv > result.csv
Учтите производительность
Скорость федеративного запроса ограничена пропускной способностью сети узлов базы данных при чтении из Object Storage. Yandex Query распределял чтение по общему пулу узлов, поэтому в базе с небольшим числом узлов тот же запрос может выполняться дольше. Если скорость важна, увеличьте число узлов базы данных или перенесите данные в колоночные таблицы.
Колоночные таблицы: загрузка данных в базу
Если одни и те же файлы читаются много раз (например, дашбордом с автообновлением), загрузите их в колоночную таблицу. Запросы к колоночной таблице не читают бакет повторно.
-
Создайте колоночную таблицу:
CREATE TABLE billing_data ( date Date NOT NULL, resource_id Utf8 NOT NULL, service_name Utf8, cost Double, PRIMARY KEY (date, resource_id) ) PARTITION BY HASH(date, resource_id) WITH (STORE = COLUMN); -
Загрузите данные из внешней таблицы:
INSERT INTO billing_data SELECT date, resource_id, service_name, cost FROM billing; -
Чтобы догружать новые файлы, запускайте такой же запрос по расписанию с фильтром по дате или пути, например из функции Cloud Functions с триггером-таймером.
-
Переключите запросы и дашборды с внешней таблицы на
billing_data.
Соединения с базами данных
Соединения Yandex Query с Managed Service for PostgreSQL, Managed Service for ClickHouse®, Managed Service for MySQL® и Yandex MPP Analytics for PostgreSQL переносятся во внешние источники данных соответствующего типа. Синтаксис запросов SELECT * FROM <источник>.<таблица> не меняется. Параметры подключения описаны в разделе Федеративные запросы
Проверьте результат
-
Выполните каждый перенесенный запрос на одном и том же наборе файлов в Yandex Query и в новом решении.
-
Сравните число строк и контрольные суммы по ключевым колонкам:
SELECT COUNT(*) AS rows, SUM(cost) AS total_cost FROM billing WHERE date BETWEEN Date("2026-09-01") AND Date("2026-09-30"); -
Переключите на новое решение дашборды, расписания и приложения, которые обращались к Yandex Query.
Если что-то пошло не так
|
Ошибка или симптом |
Что проверить |
|
|
База данных создана в режиме Serverless. Создайте базу данных с выделенными ресурсами. |
|
|
Роль |
|
Ошибка разбора данных |
Типы и обязательность колонок в схеме. Если в файле нет колонки с |
|
Запрос выполняется дольше, чем в Yandex Query |
Число узлов базы данных. Для повторяющихся запросов используйте колоночные таблицы. |
Если решить проблему не удалось, обратитесь в техническую поддержку и приложите:
- идентификатор базы данных;
- текст запроса и текст ошибки;
- время ошибки и идентификатор запроса, если он есть в выводе.