2017-08-29 25 views
8

Tôi cần trích xuất một bảng từ Teradata (truy cập chỉ đọc) sang sàn gỗ với Scala (2.11)/Spark (2.1.0). Tôi đang xây dựng một dataframe mà tôi có thể tải thành côngNullPointerException sau khi trích xuất một bảng Teradata với Scala/Spark

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

Nhưng df.show mang lại cho tôi một NullPointerException:

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

Tôi đã làm một df.printSchema và tôi phát hiện ra rằng lý do cho NPE này là tập dữ liệu chứa các giá trị null cho các cột (nullable = false) (có vẻ như Teradata đang cung cấp cho tôi thông tin sai). Thật vậy, tôi có thể đạt được một df.show nếu tôi thả các cột có vấn đề.

Vì vậy, tôi đã cố gắng xác định một schema mới với tất cả các cột thiết lập để (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() 

Nhưng sau đó tôi nhận:

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

Tôi cũng đã cố gắng để tạo ra một Dataframe mới từ trước đó , chỉ định giản đồ mong muốn:

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

Nhưng tôi vẫn nhận được NPE khi chụp ac tion trên dataframe.

Bất kỳ ý tưởng nào về cách khắc phục sự cố này?

+0

Vấn đề này dường như có liên quan, nhưng vẫn còn, không có giải pháp được cung cấp: https://community.teradata.com/t5/Connectivity/Teradata- JDBC-Trình điều khiển-trả về-the-sai-sơ đồ-cột-nullability/td-p/40628 – RaphDG

+0

Hey @RaphDG bạn đã tìm thấy bất kỳ giải pháp cho việc này. Bây giờ tôi đang chạy với vấn đề này. – Lakshman

+0

@Lakshman bạn có đang sử dụng phiên bản 2.1.0 không? – stefanobaghino

Trả lời

1

Tôi nghĩ rằng đây là giải quyết trong Teradata lọ phiên bản mới nhất, Sau khi tất cả các nghiên cứu tôi được cập nhật lọ của tôi Teradata (terajdbc4.jar và tdgssconfig.jar) phiên bản để 16.20.00.04 và thay đổi url Teradata để

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

này được làm việc sau khi tôi thêm teradta thuộc tính url COLUMN_NAME mới = ON, MAYBENULL = ON

Bây giờ mọi thứ đang làm việc tốt.

bạn có thể kiểm tra các tài liệu tham khảo ở đây

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

Các vấn đề liên quan