pyspark - 从 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 个语句的限制。
我无法同时使用该方法,请让我知道任何建议。
解决方案
获取资源(表/微分区)锁的最大等待者数量有一个软限制。如消息所示,您正在达到此限制 (20)。
那么问题来了,为什么有 20 多个会话试图在数据仓库环境中修改同一个表?根据您的问题,我假设您尝试通过多线程来增加并行度。IMO,您应该使用一个单一的火花作业,并让雪花在摄取数据时处理并行性。
如果您联系 Snowflake 支持,也可以增加此限制,但这只会让事情变得更糟,因为这不会增加并行度,只会让更多会话等待。
推荐阅读
- javascript - 如何从反应组件、react-redux 中的异步函数获取数据?
- javascript - 将停放的域页面重定向到新域中的所有共存页面
- reactjs - react的map函数中的setState
- sql - 选择所有产品的数量
- javascript - HTML、JS 随机码生成器不工作
- java - select语句中的mybatis动态列
- android - Android - 翻译后画布不绘制?
- c# - C# + C++ 中的 Windows 服务拒绝在 Docker 中启动
- amazon-ses - AWS [SES]:获取 ProductionAccessNotGrantedException 背后的原因
- sorting - 如何对使用 ajax 创建的 dom 表元素进行排序和搜索