【问题标题】:Copy Hadoop Transactional table into Snowflake将 Hadoop 事务表复制到雪花中
【发布时间】:2019-06-17 00:45:37
【问题描述】:

目前,我们使用 Hadoop 和 Snowflake 来存储我们的数据。

该过程是使用 DISTCP 将 Hadoop ORC 文件复制到 Snowflake s3 位置,然后从 S3 运行 Copy into Snowflake 表。这会将 Hadoop ORC 表中的所有内容复制到 Snowflake 表中。

现在,我有一个新要求,其中我的 Hadoop 表是一个事务表,并且现有条目每小时都会更新一次。如果我将 ORC 文件复制到 S3 并运行 Copy 命令,它会将更多条目添加到现有表中,而不是更新现有的 1。

如何在 Snowflake 中解决这个问题?

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案1】:

    通常三种策略用于这样的事情:

    • 定期重新加载所有内容 - 根据您的数据量,这可能是可能的并且速度很快(众所周知,Snowflake 每小时能够加载多个 TB)。您可以使用CREATE TABLE LIKECOPYSWAP 的组合来进行事务处理。
    • 仅识别和导出新行 - 不确定您的数据源是什么,但您或许可以做到
    • 加载到 Snowflake 时,不要插入现有行。您需要有某种方法来确定哪些行是相同的,例如ID 字段(或字段组合)。然后您可以COPY 进入临时表,然后使用MERGE 合并新的/修改的行(请参阅文档了解各种可能的选项)

    【讨论】:

      【解决方案2】:

      有点晚了,但一种可能且更准确的解决方案是:

      1. 即时创建临时表并将每小时的转换数据复制到该临时表中。
      2. 合并到最终表中:从步骤 1 中创建的临时表中,根据您的 PK 合并到最终表中。

      这是维护快照表与日志表的典型案例。 要手动避免第 1 步,您还可以利用 SNOWPIPE

      【讨论】:

        【解决方案3】:

        在这种情况下,使用 Snowflake MERGE 命令更新/插入行到目标表。除此之外,您还可以探索 Snowflake CDC 以仅加载前一时刻和当前时刻之间的变化增量:https://docs.snowflake.net/manuals/user-guide/streams.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-11-03
          • 1970-01-01
          • 2021-08-30
          • 2021-09-02
          • 2022-09-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多