我需要從Teradata(只讀訪問)中將表提取爲與Scala(2.11)/ Spark(2.1.0)一起實施。 我建立一個數據幀,我可以加載成功使用Scala/Spark提取Teradata表後提供NullPointerException
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時採取交流數據框上。
有關如何解決此問題的任何想法?
參考文檔此問題似乎是相關的,但儘管如此,沒有提供解決方案:https://community.teradata.com/t5/Connectivity/Teradata- JDBC-Driver-returns-the-wrong-schema-column-nullability/td-p/40628 – RaphDG
嗨@RaphDG你有沒有找到任何解決方案。現在我遇到了這個問題。 – Lakshman
@Lakshman你是否也使用2.1.0版本? – stefanobaghino