PySpark JDBC Teradata 连接
PySpark JDBC Teradata Connection
我使用 spark-submit
提交 spark 作业并指定最新版本的 Teradata JDBC 驱动程序 (17.10.00.14) 通过 --jars
标志加载。日志确认 JAR 文件已成功添加。
但是,当使用
连接到 Teradata 时
(
spark.read.format("jdbc").
option("url", url).
option("user", user).
option("password", password).
option("dbtable", table)
)
得到错误:Invalid connection parameter name dbtable
。
java.sql.SQLException
由 com.teradata.jdbc.jdbc_4
库抛出。
从逻辑上讲,如果我从选项中删除 dbtable
(
spark.read.format("jdbc").
option("url", url).
option("user", user).
option("password", password).
option("dbtable", table)
)
我收到另一个错误:Option 'dbtable' or 'query' is required
。
这个 IllegalArgumentException
被 pyspark
.
抛出
我的理解是 Spark 3.1.1 和 Teradata JDBC Driver 17.10.00.14.
不兼容
将 Teradata JDBC 驱动程序降级到 17.00.00.03 解决了问题,这是上述版本不兼容的证据。
更新:根据@Tom Nolan 的回复,问题根源于 PySpark 的 API 设计,他们应该更新他们的 JDBC 包装器。
Teradata 的旧版本 JDBC 版本 17.10.00.06 之前的驱动程序仅检查“用户”和“密码”属性,并忽略可能已在 Properties 对象中指定的所有其他属性。
从 Teradata JDBC Driver 17.10.00.06 开始,Properties 对象中的所有属性都经过验证和使用。
这就是Teradata JDBC驱动新旧版本行为差异的解释。
您必须避免在 Properties 对象中指定诸如“dbtable”之类的属性,这些属性不是 Teradata JDBC 驱动程序的有效连接参数。
您只能在 Properties 对象中为 Teradata JDBC 驱动程序指定有效的连接参数。如果您指定的任何属性(如“dbtable”)不是有效的 Teradata JDBC 驱动程序连接参数,则 Teradata JDBC 驱动程序 17.10.00.06 及更高版本将抛出异常“无效的连接参数名称”。
这是 Teradata JDBC 驱动程序 17.10.00.06 及更高版本的预期行为。
编辑 2021 年 8 月 16 日
我们刚刚发布了 Teradata JDBC Driver 17.10.00.20,它提供了一个新的连接参数 STRICT_NAMES=OFF(默认为 ON)。当您指定 STRICT_NAMES=OFF 时,Teradata JDBC 驱动程序将忽略无效的连接参数名称,而不是抛出异常。
请注意,DriverManager.getConnection 方法的 Properties 参数中指定的连接参数优先于 JDBC 连接 URL 中指定的连接参数。如果在两个地方都指定了相同的连接参数名称,那么将使用 Properties 参数中的连接参数值。 STRICT_NAMES 连接参数也是如此。
我使用 spark-submit
提交 spark 作业并指定最新版本的 Teradata JDBC 驱动程序 (17.10.00.14) 通过 --jars
标志加载。日志确认 JAR 文件已成功添加。
但是,当使用
连接到 Teradata 时(
spark.read.format("jdbc").
option("url", url).
option("user", user).
option("password", password).
option("dbtable", table)
)
得到错误:Invalid connection parameter name dbtable
。
java.sql.SQLException
由 com.teradata.jdbc.jdbc_4
库抛出。
从逻辑上讲,如果我从选项中删除 dbtable
(
spark.read.format("jdbc").
option("url", url).
option("user", user).
option("password", password).
option("dbtable", table)
)
我收到另一个错误:Option 'dbtable' or 'query' is required
。
这个 IllegalArgumentException
被 pyspark
.
我的理解是 Spark 3.1.1 和 Teradata JDBC Driver 17.10.00.14.
不兼容将 Teradata JDBC 驱动程序降级到 17.00.00.03 解决了问题,这是上述版本不兼容的证据。
更新:根据@Tom Nolan 的回复,问题根源于 PySpark 的 API 设计,他们应该更新他们的 JDBC 包装器。
Teradata 的旧版本 JDBC 版本 17.10.00.06 之前的驱动程序仅检查“用户”和“密码”属性,并忽略可能已在 Properties 对象中指定的所有其他属性。
从 Teradata JDBC Driver 17.10.00.06 开始,Properties 对象中的所有属性都经过验证和使用。
这就是Teradata JDBC驱动新旧版本行为差异的解释。
您必须避免在 Properties 对象中指定诸如“dbtable”之类的属性,这些属性不是 Teradata JDBC 驱动程序的有效连接参数。
您只能在 Properties 对象中为 Teradata JDBC 驱动程序指定有效的连接参数。如果您指定的任何属性(如“dbtable”)不是有效的 Teradata JDBC 驱动程序连接参数,则 Teradata JDBC 驱动程序 17.10.00.06 及更高版本将抛出异常“无效的连接参数名称”。
这是 Teradata JDBC 驱动程序 17.10.00.06 及更高版本的预期行为。
编辑 2021 年 8 月 16 日
我们刚刚发布了 Teradata JDBC Driver 17.10.00.20,它提供了一个新的连接参数 STRICT_NAMES=OFF(默认为 ON)。当您指定 STRICT_NAMES=OFF 时,Teradata JDBC 驱动程序将忽略无效的连接参数名称,而不是抛出异常。
请注意,DriverManager.getConnection 方法的 Properties 参数中指定的连接参数优先于 JDBC 连接 URL 中指定的连接参数。如果在两个地方都指定了相同的连接参数名称,那么将使用 Properties 参数中的连接参数值。 STRICT_NAMES 连接参数也是如此。