【问题标题】:Has anyone created a procedure to manually purge a stream in snowflake?有没有人创建一个程序来手动清除雪花中的流?
【发布时间】:2020-10-01 03:31:57
【问题描述】:

我正在寻找一段代码,它会导致流清空,本质上是重置它。这是用例。我们使用流将类型 2 维度表的更改跟踪到数据集市中。有时需要我们截断并重新加载该维度表以修复缺陷或其他数据问题。发生这种情况时,流需要重置以仅在重新加载发生后开始捕获更改。 Snowflake 没有 ALTER STREAM PURGE 之类的功能来为我们管理这个,所以我们需要自己做。我不想在每次需要执行此操作时都发出 CREATE OR REPLACE STREAM 语句。

【问题讨论】:

  • 您为什么不想执行 CREATE OR REPLACE STREAM 语句?您可以创建一个存储过程,为流运行 GET_DDL() 语句,然后使用该 DDL 运行 CREATE OR REPLACE STREAM 语句。
  • 虽然这可行,但我们不这样做的原因是我们使用非常严格的角色和用户组来管理生产中的 DDL 部署。我不希望开发人员通过可能会中断我们的部署管道的代码来创建生产对象。但是您绝对正确,创建或替换具有与我正在寻找的相同的影响。谢谢。

标签: stream snowflake-cloud-data-platform cdc type-2-dimension


【解决方案1】:

与 Greg 类似,如果插入现有表让您感到紧张,您可以运行类似这样的操作。

CREATE OR REPLACE TEMP TABLE RESET_TBL AS
SELECT * FROM THE_STREAM;

【讨论】:

  • 这是迄今为止最简单的解决方案。我正在努力按照您的建议使用临时表,这为我证实了这一点。如果有人感兴趣,我有下面的代码来测试它是否有效
  • 创建表 BI_DATA_MART.MY_TABLE (COL1 STRING);在表 BI_DATA_MART.MY_TABLE 上创建或替换流 MY_TABLE_STREAM; INSERT INTO BI_DATA_MART.MY_TABLE VALUES('A'); INSERT INTO BI_DATA_MART.MY_TABLE VALUES('B'); INSERT INTO BI_DATA_MART.MY_TABLE VALUES('C'); INSERT INTO BI_DATA_MART.MY_TABLE VALUES('D'); INSERT INTO BI_DATA_MART.MY_TABLE VALUES('E');选择 * 从 MY_TABLE_STREAM;创建 OR REPLACE 临时表 BI_DATA_MART.MY_TABLE_TMP AS SELECT * FROM MY_TABLE_STREAM;选择 * 从 BI_DATA_MART.MY_TABLE_TMP;从 MY_TABLE_STREAM 中选择 *;
【解决方案2】:

你可以这样做吗?

insert into THE_TARGET_TABLE select * from THE_STREAM where 1=0

这将消耗流而不更改目标表上的任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多