【发布时间】:2021-09-10 18:19:58
【问题描述】:
我正在尝试使用 Pyspark (2.4) 将数据写入 IBM DB2 (10.5 fix pack 11)。 当我尝试执行下面的代码时
df.write.format("jdbc")
.mode('overwrite').option("url",'jdbc:db2://<host>:<port>/<DB>').
option("driver", 'com.ibm.db2.jcc.DB2Driver').
option('sslConnection', 'true')
.option('sslCertLocation','</location/***_ssl.crt?').
option("numPartitions", 1).
option("batchsize", 1000)
.option('truncate','true').
option("dbtable", '<TABLE>').
option("user",'<user>').
option("password", '<PW>')
.save()
作业抛出以下异常:
文件 “/usr/local/Cellar/apache-spark/3.0.1/libexec/python/lib/py4j-0.10.9-src.zip/py4j/protocol.py”,第 326 行,在 get_return_value py4j.protocol.Py4JJavaError 中:一个错误 调用 o97.save 时发生。 : com.ibm.db2.jcc.am.SqlSyntaxErrorException:DB2 SQL 错误: SQLCODE=-104,SQLSTATE=42601, SQLERRMC=END-OF-STATEMENT;ABLE
;立即,驱动程序=4.19.80 在 com.ibm.db2.jcc.am.b5.a(b5.java:747)
Job 正在尝试执行截断,但似乎 DB2 期待 ** IMMEDIATE** 关键字
在我上面的代码中,我传递的只是 dbtable 的名称,有没有办法传递 IMMEDIATE 关键字?
同样在 DB2 方面,有没有办法在打开会话时设置它?
仅供参考,我的代码没有截断可以工作,但是删除表并重新创建和加载,我不想在 prod 环境中这样做。
非常感谢您对如何解决此问题的任何想法。
【问题讨论】:
-
如果 Db2 的 spark 方言当前不会生成
immediate关键字,请考虑一种解决方法。对于 Db2-LUW,您可以调用存储过程来为您完成工作。如果您的帐户授权正确,您可以使用这样的预先存在的程序:CALL ADMIN_CMD('IMPORT FROM /dev/null OF DEL REPLACE INTO your_schema.your_table_name ')。这是在添加 truncate ... 立即语法之前如何在 Db2-LUW 上执行未记录的空表的方法。
标签: apache-spark jdbc pyspark db2