【问题标题】:Snowflake having duplicate有重复的雪花
【发布时间】:2023-03-26 12:53:01
【问题描述】:

在我的用例中,我计划的作业读取 CSV 并写入雪花。

当我安排从 CSV 读取并每小时写入雪花时,我看到雪花中有多个重复项。尽管我的 ID 是 PRIMARY KEY (ALTER TABLE tablename ADD PRIMARY KEY (column1).

我了解 Snowflake 支持定义和维护约束,但不强制执行它们,但始终强制执行的 NOT NULL 约束除外。 我需要帮助来解决这个问题。

为了详细说明,让我们考虑一下场景:

第 1 步:上午 9 点将数据从 CSV 插入到 Snowflake ID Customer name Price 1111 John Mathew 10 1112 David Becham 20

第 2 步:晚上 10 点,我又多了一行,因此我的 CSV 是 ID Customer name Price 1111 John Mathew 10 1112 David Becham 20 1113 Hello World 40

预计在雪花中

ID Customer name Price 1111 John Mathew 10 1112 David Becham 20 1113 Hello World 40

我得到的是重复如下 ID Customer name Price 1111 John Mathew 10 1112 David Becham 20 1113 Hello World 40 1111 John Mathew 10 1112 David Becham 20

【问题讨论】:

  • 当然,如果您多次加载具有相同记录的 CSV 文件,您会看到重复项。您可以像在下面描述的任何其他数据库中一样执行此操作。

标签: primary-key snowflake-cloud-data-platform


【解决方案1】:

如果您提供了代码,将会有所帮助。看起来您正在更新 CSV,这意味着 Snowflake 将整个文件视为要加载的新文件,然后将再次加载整个文件。如果您只是在没有下游逻辑的情况下运行 COPY INTO 命令,那么就会发生这种情况。

两种选择:

1) 不要更新 CSV 文件...只需使用新数据创建一个新文件。然后,COPY INTO 命令就可以正常工作了。

2) 如果您还接收到对以前记录的更新,那么您应该将 COPY INTO 运行到临时表中,然后将 MERGE 将该数据运行到主键上的最终表中。

【讨论】:

  • 嗨@mike,我们不能在这里使用流逻辑吗?
  • 您当然可以使用流运行上面#2 中的MERGE 语句,但这通常用于连续工作流和/或持久存储正在导入的数据的工作流。我想如果这是按照建议每小时进行一次,那么使用 Snowpipe、Stream 和 Tasks 将是一个解决方案,但这里的问题实际上是 OP 如何处理对 CSV 负载的更改。
【解决方案2】:

创建另一个表(第二个表)来存储去重记录。第一个表将从您的源(CSV)获取数据。然后在第一个表上创建一个流以捕获更改。然后为该流创建一个任务,将数据合并(插入/更新)到第二个表中。

【讨论】:

    猜你喜欢
    • 2020-04-08
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2021-09-22
    相关资源
    最近更新 更多