从 Snowflake 迁移到 ClickHouse
本指南展示了如何将数据从 Snowflake 迁移到 ClickHouse。
在 Snowflake 和 ClickHouse 之间迁移数据需要使用对象存储,例如 S3,作为传输的中间存储。迁移过程还依赖于使用 Snowflake 的 COPY INTO 命令和 ClickHouse 的 INSERT INTO SELECT 命令。
从 Snowflake 导出数据
从 Snowflake 导出数据需要使用外部阶段,如图上所示。
假设我们想要导出一个具有以下模式的 Snowflake 表
要将此表的数据移动到 ClickHouse 数据库,我们首先需要将此数据复制到外部阶段。在复制数据时,我们建议使用 Parquet 作为中间格式,因为它允许共享类型信息,保留精度,压缩良好,并原生支持分析中常见的嵌套结构。
在下面的示例中,我们在 Snowflake 中创建一个名为的文件格式来表示 Parquet 和所需的文件选项。然后,我们指定哪个 bucket 将包含我们复制的数据集。最后,我们将数据集复制到 bucket。
对于大约 5TB 数据且最大文件大小为 150MB 的数据集,并使用位于相同 AWS us-east-1 区域的 2X-Large Snowflake 仓库,将数据复制到 S3 bucket 大约需要 30 分钟。
导入到 ClickHouse
一旦数据在中间对象存储中暂存,ClickHouse 函数,例如 s3 表函数,就可以用来将数据插入到表中,如下所示。
此示例使用 s3 表函数 用于 AWS S3,但 gcs 表函数 可用于 Google Cloud Storage,azureBlobStorage 表函数 可用于 Azure Blob Storage。
假设以下表目标模式
然后,我们可以使用 INSERT INTO SELECT 命令将数据从 S3 插入到 ClickHouse 表中
原始 Snowflake 表模式中的 VARIANT 和 OBJECT 列默认情况下将作为 JSON 字符串输出,迫使我们在将其插入到 ClickHouse 时进行转换。
诸如 some_file 之类的嵌套结构在 Snowflake 复制时转换为 JSON 字符串。导入此数据需要我们在 ClickHouse 中插入时使用 JSONExtract 函数 将这些结构转换为 Tuples,如上所示。