2017-08-29 103 views
8

Potrzebuję wyodrębnić tabelę z Teradata (dostęp tylko do odczytu) do parkietu za pomocą Scala (2.11)/Spark (2.1.0). Buduję dataframe że mogę załadować pomyślnieWyjątek NullPointerException po wyodrębnieniu tabeli Teradata za pomocą Scala/Spark

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

Ale df.show daje mi NullPointerException:

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

zrobiłem df.printSchema i okazało się, że powodem tego jest to, że NPE dataset zawiera wartości null dla kolumn (nullable = false) (wygląda na to, że Teradata podaje mi błędne informacje). Rzeczywiście, jeśli mogę upuścić problematyczne kolumny, mogę uzyskać df.show.

Więc starałem określając nowy schemat z wszystkich kolumn ustawionych na (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() 

Ale potem dostałam:

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

Próbowałem też utworzyć nową Dataframe od poprzedniego , określając pożądany schemat:

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

Ale nadal mam NPE przy podejmowaniu ac na ramie danych.

Masz pomysł, jak to naprawić?

+0

Kwestia ta wydaje się być związane, ale nadal nie jest rozwiązanie: https://community.teradata.com/t5/Connectivity/Teradata- JDBC-Driver-zwraca-zły-schemat-kolumna-nullability/td-p/40628 – RaphDG

+0

Hej @ RaphDG znalazłeś jakieś rozwiązanie. Teraz używam tego problemu. – Lakshman

+0

@Lakshman używasz także wersji 2.1.0? – stefanobaghino

Odpowiedz

1

myślę, że ten zostanie rozwiązany w najnowszej wersji Teradata słoików, po wszystkim badania zaktualizowałem moje słoiki Teradata (terajdbc4.jar i tdgssconfig.jar) wersję do 16.20.00.04 i zmienił URL Teradata do

teradata.connection.url=jdbc:teradata://hostname.some.com/ 
TMODE=ANSI,CHARSET=UTF8,TYPE=FASTEXPORT,COLUMN_NAME=ON,MAYBENULL=ON 

to działało po dodaniu teradta Właściwości URL COLUMN_NAME = ON, MAYBENULL = ON

teraz wszystko działa.

można sprawdzić dokument referencyjny tutaj

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