目前,我们使用Hadoop和Snowflake来存储我们的数据。
该过程是使用 DISTCP 将 Hadoop ORC 文件复制到 Snowflake s3 位置,然后从 S3 运行复制到 Snowflake 表。这会将Hadoop ORC表中的所有内容复制到Snowflake表中。
现在,我有一个新的要求,其中我的Hadoop表是一个事务表,现有条目每小时更新一次。如果我将 ORC 文件复制到 S3 并运行复制命令,它会向现有表添加更多条目,而不会更新现有的 1。
如何在雪花中解决这个问题?
三种策略用于这样的事情:
- 定期重新加载所有内容 - 根据您的数据量,这可能是可能的和快速的(众所周知,Snowflake 每小时能够加载多个 TB)。您可以使用
CREATE TABLE LIKE
、COPY
和SWAP
的组合来事务性地执行此操作。 - 仅识别和导出新行 - 不确定数据源是什么,但您可以做到这一点
- 加载到雪花时,不要插入现有行。您需要有某种方法来确定哪些行是相同的,例如 ID 字段(或字段组合)。然后,您可以
COPY
到临时表中,然后使用MERGE
合并新的/修改的行(有关各种可能的选项,请参阅文档)
有点晚了,但一个可能且更准确的解决方案是:
- 动态创建瞬态表
- ,并将每小时转换数据复制到此瞬态表。
- 合并到最终表 :从步骤 1 中创建的瞬态表中,根据您的 PK 合并到最终表中。
这是维护快照表与日记表的典型情况。为了避免手动执行步骤 1,您还可以利用 SNOWPIPE。
请使用 Snowflake MERGE 命令将行更新/插入到目标表中。除此之外,您还可以探索雪花 CDC 以仅加载上一个时刻和当前时刻之间的更改增量:https://docs.snowflake.net/manuals/user-guide/streams.html