跳至主要内容

从 Snowflake 迁移到 ClickHouse

本指南介绍如何将数据从 Snowflake 迁移到 ClickHouse。

在 Snowflake 和 ClickHouse 之间迁移数据需要使用对象存储(如 S3)作为传输的中介存储。迁移过程还依赖于使用 Snowflake 的 COPY INTO 命令和 ClickHouse 的 INSERT INTO SELECT 命令。

1. 从 Snowflake 导出数据

Migrating from Snowflake to ClickHouse

从 Snowflake 导出数据需要使用外部阶段,如上图所示。

假设我们要导出一个具有以下模式的 Snowflake 表

CREATE TABLE MYDATASET (
timestamp TIMESTAMP,
some_text varchar,
some_file OBJECT,
complex_data VARIANT,
) DATA_RETENTION_TIME_IN_DAYS = 0;

为了将该表的 数据移动到 ClickHouse 数据库,我们首先需要将这些数据复制到外部阶段。在复制数据时,我们建议使用 Parquet 作为中介格式,因为它允许共享类型信息、保留精度、压缩良好且原生支持分析中常见的嵌套结构。

在下面的示例中,我们在 Snowflake 中创建一个名为文件格式以表示 Parquet 和所需的文件选项。然后,我们指定哪个存储桶将包含我们复制的数据集。最后,我们将数据集复制到该存储桶。

CREATE FILE FORMAT my_parquet_format TYPE = parquet;

-- Create the external stage that specifies the S3 bucket to copy into
CREATE OR REPLACE STAGE external_stage
URL='s3://mybucket/mydataset'
CREDENTIALS=(AWS_KEY_ID='<key>' AWS_SECRET_KEY='<secret>')
FILE_FORMAT = my_parquet_format;

-- Apply "mydataset" prefix to all files and specify a max file size of 150mb
-- The `header=true` parameter is required to get column names
COPY INTO @external_stage/mydataset from mydataset max_file_size=157286400 header=true;

对于大约 5TB 的数据集,最大文件大小为 150MB,并且使用位于同一 AWS us-east-1 区域中的 2X-Large Snowflake 仓库,将数据复制到 S3 存储桶大约需要 30 分钟。

2. 导入 ClickHouse

数据在中介对象存储中暂存后,可以使用 ClickHouse 函数(如 s3 表函数)将数据插入表中,如下所示。

此示例使用针对 AWS S3 的 s3 表函数,但对于 Google Cloud Storage,可以使用 gcs 表函数,对于 Azure Blob Storage,可以使用 azureBlobStorage 表函数

假设以下表目标模式

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, -- Ensure columns are inserted as default if values are null
input_format_parquet_case_insensitive_column_matching = 1 -- Column matching between source data and target table should be case insensitive
关于嵌套列结构的说明

原始 Snowflake 表模式中的 VARIANTOBJECT 列默认情况下将作为 JSON 字符串输出,这迫使我们在将它们插入 ClickHouse 时强制转换它们。

some_file 这样的嵌套结构在 Snowflake 复制时会被转换为 JSON 字符串。导入这些数据需要我们在 ClickHouse 插入时使用 JSONExtract 函数 将这些结构转换为元组,如上所示。

3. 测试成功的数据导出

要测试数据是否已正确插入,只需对新表运行一个 SELECT 查询

SELECT * FROM mydataset limit 10;

进一步阅读和支持

除了本指南,我们还建议阅读我们的博客文章 比较 Snowflake 和 ClickHouse

如果您在将数据从 Snowflake 迁移到 ClickHouse 时遇到问题,请随时通过 [email protected] 联系我们。