Snowflake cloud data platform 雪花:在TRUNCATE加载旧数据后复制到?

Snowflake cloud data platform 雪花:在TRUNCATE加载旧数据后复制到?,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我从Snowflake那里得到了一些意想不到的行为,我希望有人能解释发生了什么,以及最好的处理方法。基本上,我尝试每晚刷新整个数据集,但截断表并将数据暂存/复制到其中会导致加载旧数据 我使用的Python连接器的AUTOCOMMIT=False。每个步骤后都会手动提交事务 步骤1:将数据加载到空表中 put file://test.csv @test_db.test_schema.%test_table overwrite=true copy into test_db.test_schema.t

我从Snowflake那里得到了一些意想不到的行为,我希望有人能解释发生了什么,以及最好的处理方法。基本上,我尝试每晚刷新整个数据集,但截断表并将数据暂存/复制到其中会导致加载旧数据

我使用的Python连接器的AUTOCOMMIT=False。每个步骤后都会手动提交事务

步骤1:将数据加载到空表中

put file://test.csv @test_db.test_schema.%test_table overwrite=true
copy into test_db.test_schema.test_table file_format=(format_name=my_format))
步骤2:数据被截断

截断test\u db.test\u schema.test\u表

步骤3:将新数据加载到现在为空的表中,文件名相同,但覆盖设置为True

put file://test.csv @test_db.test_schema.%test_table overwrite=true
copy into test_db.test_schema.test_table file_format=(format_name=my_format))
此时,如果查询表中的数据,我会看到它是步骤1中的数据,而不是步骤3中的数据。如果在步骤2中,我删除并重新创建表,而不是使用TRUNCATE,那么我将看到步骤3中的数据,这与预期的一样。我正在努力了解发生了什么。Snowflake是否使用缓存版本的数据,即使我使用的是PUT with OVERWRITE=TRUE?实现我想要的行为的最佳方式是什么?谢谢大家!

我使用的Python连接器的AUTOCOMMIT=False。每个步骤后都会手动提交事务

您确定您正在手动提交每个步骤并成功返回吗

以以下方式运行语句会再现问题,这是可以理解的,因为TRUNCATE和COPY INTO TABLE语句在此模式下不会自动提交:

[第1步] 犯罪 [步骤2] [步骤3] 从测试_表中选择*在步骤1中打印文件中的行 但是,将其修改为始终提交会将行为更改为预期行为:

<BEGIN_SCRIPT 1>
[Step 1]
COMMIT
<END_SCRIPT 1>

<BEGIN_SCRIPT 2>
[Step 2]
COMMIT
[Step 3]
COMMIT
<END_SCRIPT 2>

SELECT * FROM test_table; -- Prints rows from file in Step 3
如果在步骤2中我删除并重新创建表,而不是使用TRUNCATE,我会看到步骤3中的数据

这是预期的,因为CREATE是一个DDL语句,而不管Snowflake中的覆盖如何。执行CREATE代替TRUNCATE会隐式地在该步骤上执行提交,这进一步重申您的测试在步骤2和步骤3中没有正确提交

Snowflake是否使用缓存版本的数据,即使我使用的是PUT with OVERWRITE=TRUE


否,如果PUT成功,则它已按照指示执行覆盖,前提是文件名保持不变。较旧版本的阶段数据在被覆盖后将不再存在。

能否检查以下步骤是否符合您的要求

创建阶段表 截断你的舞台桌子 将整个数据集的夜间刷新加载到stage表。 使用merge语句将数据从阶段表复制到目标表。为了合并两个表,您需要主键 在继续下一步之前,请确保已成功截断阶段表


希望这能有所帮助。

感谢您的明确解释!事实证明,手动提交确实存在问题。DDL语句是自动提交的,不管覆盖是什么,这一事实让我很恼火——很高兴知道!