跳到主要内容
跳到主要内容

从 Snowflake 迁移到 ClickHouse

本指南展示如何将数据从 Snowflake 迁移到 ClickHouse。

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

1. 从 Snowflake 导出数据

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

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

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

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

对于大约 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 表函数

假设以下表的目标模式:

然后我们可以使用 INSERT INTO SELECT 命令将数据从 S3 插入到 ClickHouse 表:

关于嵌套列结构的说明

原始 Snowflake 表模式中的 VARIANTOBJECT 列默认将输出为 JSON 字符串,这需要我们在将其插入 ClickHouse 时进行转换。

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

3. 测试数据导出是否成功

要测试您的数据是否正确插入,只需对新表运行 SELECT 查询: