使用ur命令Spark读取jdbcdb2

使用ur命令Spark读取jdbcdb2,jdbc,pyspark,db2,Jdbc,Pyspark,Db2,我试图使用read.jdbc从Db2中提取数据以激发兴趣。我无法在查询中传递UR字符串 如何在spark jdbc读取中将隔离设置为UR import json #spark = SparkSession.builder.config('spark.driver.extraClassPath', '/home/user/db2jcc4.jar').getOrCreate() jdbcUrl = "jdbc:db2://{0}:{1}/{2}".format("db2

我试图使用read.jdbc从Db2中提取数据以激发兴趣。我无法在查询中传递UR字符串

如何在spark jdbc读取中将隔离设置为UR

import json
#spark = SparkSession.builder.config('spark.driver.extraClassPath', '/home/user/db2jcc4.jar').getOrCreate()
jdbcUrl = "jdbc:db2://{0}:{1}/{2}".format("db2.1234.abcd.com", "3910", "DSN")
connectionProperties = {
  "user" : "user1",
  "password" : "password1",
  "driver" : "com.ibm.db2.jcc.DB2Driver",
  "fetchsize" : "100000"
}
pushdown_query = "(SELECT T6.COLUMN1, T6.COLUMN2 ,TO_DATE('07/11/2019 10:52:24', 'MM/DD/YYYY HH24:MI:SS') AS INSERT_DATE FROM DB1.T6 WITH UR ) ALIAS"
print(jdbcUrl)
df = spark.read.jdbc(url=jdbcUrl, table=pushdown_query, column="COLUMN1", lowerBound=1, upperBound=12732076, numPartitions=5, properties=connectionProperties)
此操作失败,错误为:com.ibm.db2.jcc.am.SqlSyntaxErrorException:db2sql错误:SQLCODE=-199,SQLSTATE=42601,SQLERRMC=UR;;FETCH,)偏移量限制与具有联接的订单组相交,驱动程序=4.13.80

如果我移除UR,它将工作。在spark jdbc read中有没有一种通过UR传递查询的方法

jdbc中有连接参数,但这里提到的连接参数仅适用于编写 isolationLevel事务隔离级别,适用于当前连接。它可以是NONE、READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ或SERIALIZABLE中的一个,对应于JDBC的连接对象定义的标准事务隔离级别,默认为READ_UNCOMMITTED。此选项仅适用于书写。请参阅java.sql.Connection中的文档

下面的方法会奏效吗

connectionProperties = {
      "user" : "user1",
      "password" : "password1",
      "driver" : "com.ibm.db2.jcc.DB2Driver",
      "fetchsize" : "100000",
"isolationLevel" : "READ_UNCOMMITTED" 
    }

根据文档,在读取操作中忽略isolationLevel

老实说,我不明白为什么,因为java.sql.connection setIsolationLevel为整个连接设置了默认值,而afaik read本身并没有设置isolationLevel

然而,它提供了一种不同的方法

因此,以下内容应该适合您:

#spark = SparkSession.builder.config('spark.driver.extraClassPath', '/home/user/db2jcc4.jar').getOrCreate()
jdbcUrl = "jdbc:db2://{0}:{1}/{2}".format("db2.1234.abcd.com", "3910", "DSN")
connectionProperties = {
  "user" : "user1",
  "password" : "password1",
  "driver" : "com.ibm.db2.jcc.DB2Driver",
  "fetchsize" : "100000"
}

df = spark.read.jdbc(url=jdbcUrl, table="DB1.T6", predicates=["1=1 WITH UR"], properties=connectionProperties).select("COLUMN1", "COLUMN2", ...)
我使用1=1子句来生成有效的where条件。
这个approch看起来确实像是有一种更干净的方法,但是根据DB2文档,它工作得很好,同时在我们可以传递的连接细节中连接到DB2 defaultIsolationLevel=1,表示未提交的读取。
查看链接:

它成功了吗?