是否可以对来自 Spark 的所有查询进行一次交易?据我所知,不支持交易。但是,最近我在尝试使用雪花事务的 Spark (pyspark) 作业中遇到了以下代码:
run_snowflake_query(sfOptions, "BEGIN TRANSACTION;")
run_snowflake_query(sfOptions, prep_query_1)
run_snowflake_query(sfOptions, prep_query_2)
df.write.format(SNOWFLAKE_SOURCE_NAME).options(**sfOptions).option(
"dbtable", OUTPUT_TABLE
).mode("append").save()
run_snowflake_query(sfOptions, delete_query_1)
run_snowflake_query(sfOptions, "COMMIT;")
答案 0 :(得分:0)
Snowflake 支持交易:
通过连接器使用事务时,您需要注意并发性:
<块引用>虽然多个会话不能共享同一个事务,但是使用单个连接的多个线程共享同一个会话,从而共享同一个事务。这可能会导致意外结果,例如一个线程回滚另一个线程中完成的工作。
<块引用>当使用 Snowflake 驱动程序(例如 Snowflake JDBC 驱动程序)或连接器(例如 Python 的 Snowflake 连接器)的客户端应用程序是多线程时,就会出现这种情况。如果两个或多个线程共享同一个连接,那么这些线程也共享该连接中的当前事务。一个线程的 BEGIN TRANSACTION、COMMIT 或 ROLLBACK 会影响使用该共享连接的所有线程。如果线程异步运行,结果可能无法预测。
您还需要注意 DDL 语句(如 CREATE TABLE
)出现在它们自己的事务中:
如果在事务处于活动状态时执行 DDL 语句,则 DDL 语句: 隐式提交活动事务。 将 DDL 语句作为单独的事务执行。