首页 > 解决方案 > 从 pyspark 数据帧插入数据时,雪花中的锁定问题

问题描述

我正在尝试借助以下代码将 pyspark 数据框插入雪花表:

sfOptions = {
  "sfURL" : "XXXXXXXXXXXX",
  "sfAccount" : "XXXXXXXXXXXX",
  "sfUser" : "XXXXXXXXXXXX",
  "sfPassword" : "XXXXXXXXXXXX",
  "sfDatabase" : "XXXXXXXXXXXX",
  "sfSchema" : "XXXXXXXXXXXX",
  "sfWarehouse" : "XXXXXXXXXXXX",
  "sfRole" : "XXXXXXXXXXXX",
  "column_mapping" : "name",
  "column_mismatch_behavior":"ignore"
    }
  
df.write.format("snowflake") \
              .options(**sfOptions) \
              .option("dbtable", table).mode("append").save()

在上面的代码的帮助下,我成功地将数据插入到表中。但是当我尝试在多线程中执行相同的操作时,出现以下错误:

y4JJavaError:调用 o146688.save 时出错。:net.snowflake.client.jdbc.SnowflakeSQLException:语句'019fce57-0b02-036b-0000-467d0010e94a'已锁定事务1635015824820中的表'ERROR_RECORDS',此锁尚未释放。您的语句 '019fce57-0b02-036b-0000-467d0010e9f2' 已中止,因为此锁的服务员数量超过了 20 个语句的限制。

我无法同时使用该方法,请让我知道任何建议。

标签: pysparksnowflake-cloud-data-platform

解决方案


获取资源(表/微分区)锁的最大等待者数量有一个软限制。如消息所示,您正在达到此限制 (20)。

那么问题来了,为什么有 20 多个会话试图在数据仓库环境中修改同一个表?根据您的问题,我假设您尝试通过多线程来增加并行度。IMO,您应该使用一个单一的火花作业,并让雪花在摄取数据时处理并行性。

如果您联系 Snowflake 支持,也可以增加此限制,但这只会让事情变得更糟,因为这不会增加并行度,只会让更多会话等待。

https://community.snowflake.com/s/article/Your-statement-was-aborted-because-the-number-of-waiters-for-this-lock-exceeds-the-20-statements-limit


推荐阅读