使用 Spark 从 teradata 表读取数据时出现 ExceptionInInitializer 错误

Dig*_*ela 0 jdbc teradata apache-spark apache-spark-sql

我使用下面的代码从 teradata 读取数据但出现错误

val jdbcDF = spark.read
  .format("jdbc")
  .option("url",s"jdbc:teradata://${TeradataDBHost}/database=${TeradataDBDatabase}")
  .option("dbtable", TeradataDBDatabase+"."+TeradataDBTable)
  .option("driver","com.teradata.jdbc.TeraDriver")
  .option("user", TeradataDBUsername)
  .option("password", TeradataDBPassword)
  .load()
Run Code Online (Sandbox Code Playgroud)

错误堆栈跟踪

val jdbcDF = spark.read
  .format("jdbc")
  .option("url",s"jdbc:teradata://${TeradataDBHost}/database=${TeradataDBDatabase}")
  .option("dbtable", TeradataDBDatabase+"."+TeradataDBTable)
  .option("driver","com.teradata.jdbc.TeraDriver")
  .option("user", TeradataDBUsername)
  .option("password", TeradataDBPassword)
  .load()
Run Code Online (Sandbox Code Playgroud)

Luk*_*ard 5

来自Teradata JDBC 驱动程序文档

如果您收到以下异常之一:

  • com.teradata.tdgss.jtdgss.TdgssConfigApi.GetMechanisms 处出现 NullPointerException
  • IllegalArgumentException “InputStream 不能为空”,位于 javax.xml.parsers.DocumentBuilder.parse、com.teradata.tdgss.jtdgss.TdgssParseXml.parse

那么问题可能是由于classpath没有设置,或者classpath设置错误,导致找不到tdgssconfig.jar。

所以我猜想tdgssconfig.jar在类路径上找不到它。

当然,如果 JDBC 驱动程序能够抛出比 NPE 更有用的错误消息,那就太好了。我有点担心这似乎是驱动程序的“已知问题”:我无法想象在这种情况下抛出更有用的异常会花费很多精力。如果他们选择记录这种行为而不是修复它,那对他们来说并没有多大意义。

(致谢:通过此 Teradata 社区帖子找到。)