В этом руководстве показано, как выполнить миграцию данных из Snowflake в ClickHouse.
Для миграции данных между Snowflake и ClickHouse требуется объектное хранилище,
например S3, в качестве промежуточного хранилища для переноса данных. В процессе миграции также
используются команда COPY INTO в Snowflake и команда INSERT INTO SELECT
в ClickHouse.
Экспорт данных из Snowflake

Для экспорта данных из Snowflake требуется использовать внешний stage, как показано на диаграмме выше.
Предположим, мы хотим экспортировать таблицу Snowflake со следующей схемой:
CREATE TABLE MYDATASET (
timestamp TIMESTAMP,
some_text varchar,
some_file OBJECT,
complex_data VARIANT,
) DATA_RETENTION_TIME_IN_DAYS = 0;Чтобы перенести данные из этой таблицы в базу данных ClickHouse, сначала нужно скопировать их во внешний stage. При копировании данных мы рекомендуем использовать Parquet в качестве промежуточного формата, поскольку он позволяет сохранять информацию о типах, не теряет точность, хорошо сжимается и изначально поддерживает вложенные структуры, часто используемые в аналитике.
В примере ниже мы создаем в Snowflake именованный файловый формат для Parquet и задаем нужные параметры файла. Затем указываем, в каком бакете будет храниться скопированный dataset. Наконец, копируем dataset в этот бакет.
CREATE FILE FORMAT my_parquet_format TYPE = parquet;
-- Создаем внешний stage, указывающий S3 бакет, в который нужно копировать данные
CREATE OR REPLACE STAGE external_stage
URL='s3://mybucket/mydataset'
CREDENTIALS=(AWS_KEY_ID='<key>' AWS_SECRET_KEY='<secret>')
FILE_FORMAT = my_parquet_format;
-- Добавляем префикс "mydataset" ко всем файлам и задаем максимальный размер файла 150 МБ
-- Параметр `header=true` обязателен, чтобы получить имена столбцов
COPY INTO @external_stage/mydataset from mydataset max_file_size=157286400 header=true;Для dataset объемом около 5 ТБ, с максимальным размером файла 150 МБ и при использовании хранилища Snowflake 2X-Large, расположенного в том же Region AWS us-east-1, копирование данных в S3 бакет займет около 30 минут.
Импорт в ClickHouse
После того как данные помещены в промежуточное Объектное хранилище, для их вставки в таблицу можно использовать функции ClickHouse, такие как s3 table function, как показано ниже.
В этом примере используется s3 table function для AWS S3, но для Google Cloud Storage можно использовать gcs table function, а для Azure Blob Storage — azureBlobStorage table function.
Предположим, целевая таблица имеет следующую схему:
CREATE TABLE default.mydataset
(
`timestamp` DateTime64(6),
`some_text` String,
`some_file` Tuple(filename String, version String),
`complex_data` Tuple(name String, description String),
)
ENGINE = MergeTree
ORDER BY (timestamp)Затем можно использовать команду INSERT INTO SELECT, чтобы вставить данные из S3 в таблицу ClickHouse:
INSERT INTO mydataset
SELECT
timestamp,
some_text,
JSONExtract(
ifNull(some_file, '{}'),
'Tuple(filename String, version String)'
) AS some_file,
JSONExtract(
ifNull(complex_data, '{}'),
'Tuple(filename String, description String)'
) AS complex_data,
FROM s3('https://mybucket.s3.amazonaws.com/mydataset/mydataset*.parquet')
SETTINGS input_format_null_as_default = 1, -- Гарантирует, что в столбцы будут вставлены значения по умолчанию, если значения равны null
input_format_parquet_case_insensitive_column_matching = 1 -- Сопоставление столбцов между исходными данными и целевой таблицей должно быть регистронезависимымПроверка успешного экспорта данных
Чтобы проверить, что данные были корректно вставлены, просто выполните запрос SELECT к новой таблице:
SELECT * FROM mydataset LIMIT 10;