【问题标题】:NullPointerException after extracting a Teradata table with Scala/Spark使用 Scala/Spark 提取 Teradata 表后出现 NullPointerException
【发布时间】:2018-02-06 14:23:42
【问题描述】:

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

val df = spark.read.format("jdbc").options(options).load()

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

java.lang.NullPointerException
at org.apache.spark.sql.catalyst.expressions.codegen.UnsafeRowWriter.write(UnsafeRowWriter.java:210)

我做了一个df.printSchema,我发现这个 NPE 的原因是数据集包含(nullable = false) 列的null 值(看起来 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()

但后来我得到了:

org.apache.spark.sql.AnalysisException: JDBC does not allow user-specified schemas.;

我还尝试从前一个数据框创建一个新的数据框,指定所需的架构:

val new_df = df.sqlContext.createDataFrame(df.rdd, new_schema)

但在对数据框采取行动时,我仍然遇到 NPE。

知道如何解决这个问题吗?

【问题讨论】:

标签: scala apache-spark dataframe apache-spark-sql teradata


【解决方案1】:

我认为这已在 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

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

现在一切正常。

你可以在这里查看参考文档

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

【讨论】:

    猜你喜欢
    • 2018-04-24
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 2016-04-25
    • 2018-01-16
    • 2018-03-11
    • 1970-01-01
    相关资源
    最近更新 更多