【发布时间】: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。
知道如何解决这个问题吗?
【问题讨论】:
-
这个问题似乎是相关的,但仍然没有提供解决方案:community.teradata.com/t5/Connectivity/…
-
嘿@RaphDG 你有没有找到任何解决方案。现在我正在解决这个问题。
-
@Lakshman 你也在使用 2.1.0 版吗?
-
我使用的是 2.2.0
-
@stefanobaghino 你可以在这里查看我的问题stackoverflow.com/questions/48889855/…
标签: scala apache-spark dataframe apache-spark-sql teradata