我正在使用我在论坛上找到的方法将数据加载到雪花 snowpipe -> load_table <-> 临时表 -> 最终表 我有一个任务树,用于检查 load_table 上的流,如果找到数据,则将 load_table 与 staging_table 交换 进一步的任务将 staging_table 处理到最终表中 然后 staging_table 被截断并与 load_table 交换回
这通常工作正常,但我看到的问题是我最终在 load_table 或 staging_table 上得到孤立记录,而 load_stream 为空。 现在,即使我手动将数据插入 load_table,流仍被标记为空,因此没有任务运行。
交换包含流的表时的预期行为是什么,是否支持上述行为或者我是否需要寻找替代方法? 目标是使用 snowpipe 将文件从 S3 加载到临时表中并将它们合并到最终表中,而无需管理不断增长的暂存表...
谢谢!
/编辑 做一些实验,似乎当表被交换时,流仍然监听“原始”表,因此将忽略雪管加载到“新”表的任何数据,即使新表已与原始表交换.. .
答案 0 :(得分:1)
问题是,SHOW STREAMS 和 DESCRIBE STREAM 提供了错误的信息:
create or replace table test1 (v varchar);
create or replace table test2 (v1 varchar, v2 varchar);
create or replace stream test_stream_1 on table test1;
alter table test1 swap with test2;
show streams like 'test_stream_1';
+---------------+------------------------+
| name | table_name |
+---------------+------------------------+
| TEST_STREAM_1 | GOKHAN_DB.PUBLIC.TEST1 |
+---------------+------------------------+
交换操作后应该指向GOKHAN_DB.PUBLIC.TEST2!我建议您提交支持案例。
好消息是,get_ddl 返回了正确的结果:
select get_ddl('stream','test_stream_1');
+--------------------------------------------------------+
| GET_DDL('STREAM','TEST_STREAM_1') |
+--------------------------------------------------------+
| create or replace stream TEST_STREAM_1 on table TEST2; |
+--------------------------------------------------------+