使用Scala/Spark提取Teradata表后出现NullPointerException

Rap*_*hDG 9 scala teradata dataframe apache-spark apache-spark-sql

我需要从Teradata(只读访问)中提取一个表到Scala(2.11)/ Spark(2.1.0).我正在构建一个可以成功加载的数据框

val df = spark.read.format("jdbc").options(options).load()
Run Code Online (Sandbox Code Playgroud)

但是df.show给了我一个NullPointerException:

java.lang.NullPointerException
at org.apache.spark.sql.catalyst.expressions.codegen.UnsafeRowWriter.write(UnsafeRowWriter.java:210)
Run Code Online (Sandbox Code Playgroud)

我做了一个df.printSchema,我发现这个NPE的原因是数据集包含列的null(nullable = false)(看起来Teradata给我错误的信息).实际上,df.show如果我删除有问题的列,我可以实现.

所以,我尝试指定一个新架构,所有列都设置为(nullable = true):

val new_schema = StructType(df.schema.map {
  case StructField(n,d,nu,m) => StructField(n,d,true,m)
})

val new_df = spark.read.format("jdbc").schema(new_schema).options(options).load()
Run Code Online (Sandbox Code Playgroud)

但后来我得到了:

org.apache.spark.sql.AnalysisException: JDBC does not allow user-specified schemas.;
Run Code Online (Sandbox Code Playgroud)

我还尝试从前一个创建一个新的Dataframe,指定所需的模式:

val new_df = df.sqlContext.createDataFrame(df.rdd, new_schema)
Run Code Online (Sandbox Code Playgroud)

但是在对数据帧采取行动时我仍然有一个NPE.

关于如何解决这个问题的任何想法?

Use*_*567 5

我认为这已在 teradata 最新版本的 jar 中解决,经过所有研究,我将teradata jar (terajdbc4.jar 和 tdgssconfig.jar)版本更新为16.20.00.04 并将 teradata url 更改为

teradata.connection.url=jdbc:teradata://hostname.some.com/
TMODE=ANSI,CHARSET=UTF8,TYPE=FASTEXPORT,COLUMN_NAME=ON,MAYBENULL=ON
Run Code Online (Sandbox Code Playgroud)

这是在我添加 teradta url 属性COLUMN_NAME=ON,MAYBENULL=ON后起作用的

现在一切正常。

您可以在此处查看参考文档

https://developer.teradata.com/doc/connectivity/jdbc/reference/current/jdbcug_chapter_2.html#2403_2403ch022113