加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 08:53:12 所属栏目:安全 来源:网络整理
导读:我需要从Teradata(只读访问)中提取一个表到 Scala(2.11)/ Spark(2.1.0). 我正在构建一个可以成功加载的数据框 val df = spark.read.format("jdbc").options(options).load() 但是df.show给了我一个NullPointerException: java.lang.NullPointerExceptionat
我需要从Teradata(只读访问)中提取一个表到 Scala(2.11)/ Spark(2.1.0).
我正在构建一个可以成功加载的数据框

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)列的空值(看起来Teradata给了我错误的信息).实际上,如果我删除有问题的列,我可以实现df.show.

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

val new_schema = StructType(df.schema.map {
  case StructField(n,d,nu,m) => StructField(n,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.;

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

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

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

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

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读