雪花交易和 Spark

时间:2021-04-27 19:24:17

标签: apache-spark snowflake-cloud-data-platform

是否可以对来自 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;")

1 个答案:

答案 0 :(得分:0)

Snowflake 支持交易:

通过连接器使用事务时,您需要注意并发性:

<块引用>

虽然多个会话不能共享同一个事务,但是使用单个连接的多个线程共享同一个会话,从而共享同一个事务。这可能会导致意外结果,例如一个线程回滚另一个线程中完成的工作。

<块引用>

当使用 Snowflake 驱动程序(例如 Snowflake JDBC 驱动程序)或连接器(例如 Python 的 Snowflake 连接器)的客户端应用程序是多线程时,就会出现这种情况。如果两个或多个线程共享同一个连接,那么这些线程也共享该连接中的当前事务。一个线程的 BEGIN TRANSACTION、COMMIT 或 ROLLBACK 会影响使用该共享连接的所有线程。如果线程异步运行,结果可能无法预测。

您还需要注意 DDL 语句(如 CREATE TABLE)出现在它们自己的事务中:

<块引用>

如果在事务处于活动状态时执行 DDL 语句,则 DDL 语句: 隐式提交活动事务。 将 DDL 语句作为单独的事务执行。