无法从 Snowpark 追加到 Snowflake 表

问题描述 投票:0回答:2

我想将 pandas DataFrame 插入到 Snowflake 表中,但是我得到了

存储过程执行错误:存储过程中启动的作用域事务不完整,已回滚。

当我跑步时

session.write_pandas(df=my_df, table_name='MY_TABLE_NAME')

但是,当我插入并覆盖表的内容时,它就起作用了:

session.write_pandas(df=my_df, table_name='MY_TABLE_NAME', overwrite=True)

我是否缺少一些仅附加的选项?

编辑

对于上下文,我在 Snowflake Python 工作表中运行它。在

session.write_pandas(...)
行之前,我查询了多个表(通过
session.table(...).filter(...).to_pandas()
)。

编辑2

在 write_pandas 之前运行

session.sql("SHOW PARAMETERS LIKE 'AUTOCOMMIT';").show()
,我看到
AUTOCOMMIT
设置为 false。我无法在 Snowpark Python API 文档中找到设置它的方法。还有其他方法可以设置吗

布尔值
“钥匙” “价值” “默认” “水平” “描述” “类型”
自动提交 真实 账户 自动提交属性确定是否包含在事务中。如果 autocom...
需要事务的语句被隐式执行...
。如果自动提交关闭,则明确...
关闭事务。默认自动提交...
snowflake-cloud-data-platform
2个回答
0
投票
由于 Autocommit 参数设置为 False,您的插入不起作用,您可以在追加数据之前将 AUTOCOMMIT 参数设置为 True:

import pandas as pd from snowflake.snowpark import Session s_conStr = { "account": "xyz", "user": "user_name", "password": "pwd", "warehouse": "WH", "role": "ANALYST", "database": "DB", "SCHEMA": "schema" } o_snowpark_session = Session.builder.configs(s_conStr).create() current_db = o_snowpark_session.sql("SELECT CURRENT_DATABASE()").collect() print(current_db) data = { "calories": [420, 380, 390], "duration": [50, 40, 45] } final_data1 = pd.DataFrame(data) o_snowpark_session.sql("SHOW PARAMETERS LIKE 'AUTOCOMMIT';").show() o_snowpark_session.sql("alter session set AUTOCOMMIT=True").show() o_snowpark_session.sql("SHOW PARAMETERS LIKE 'AUTOCOMMIT';").show() o_snowpark_session.write_pandas(final_data1, "TEST_INSERT")
上面的代码将为会话设置 AUTOCOMMIT 参数 true。


0
投票
我使用以下代码创建了工作表:

# create or replace table MY_TABLE_NAME # ("calories" number, "duration" number); import snowflake.snowpark as snowpark from snowflake.snowpark.functions import col import pandas as pd def main(session: snowpark.Session): data = { "calories": [420, 380, 390], "duration": [50, 40, 45] } data = pd.DataFrame(data) print(data) session.write_pandas(df=data, table_name='MY_TABLE_NAME') session.write_pandas(df=data, table_name='MY_TABLE_NAME') session.write_pandas(df=data, table_name='MY_TABLE_NAME') return "Done"
但是我无法重现您的问题。我不需要设置任何自动提交。也许您可以分享更多详细信息或查看查询历史记录。

© www.soinside.com 2019 - 2024. All rights reserved.