2017-08-29 100 views
8

我需要從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時採取交流數據框上。

有關如何解決此問題的任何想法?

+0

參考文檔此問題似乎是相關的,但儘管如此,沒有提供解決方案:https://community.teradata.com/t5/Connectivity/Teradata- JDBC-Driver-returns-the-wrong-schema-column-nullability/td-p/40628 – RaphDG

+0

嗨@RaphDG你有沒有找到任何解決方案。現在我遇到了這個問題。 – Lakshman

+0

@Lakshman你是否也使用2.1.0版本? – stefanobaghino

回答

1

我認爲這是Teradata的最新版本罐子解決,所有的研究,我更新了我的Teradata罐子(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 

後,我加入t​​eradta URL屬性COLUMN_NAME = ON,MAYBENULL = ON

現在一切正常,這是工作。

您可以點擊這裏

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