簡體   English   中英

PySpark: Why do I get 'getLong not implemented for class oracle.jdbc.driver.T4CRowidAccessor' when creating a table in Oracle via JDBC?

[英]PySpark: Why do I get 'getLong not implemented for class oracle.jdbc.driver.T4CRowidAccessor' when creating a table in Oracle via JDBC?

我是 Pyspark 的新手,我已經很久沒有看到任何東西 Java 所以要溫柔。 我在 SO 上看到了類似的問題,但它們似乎都在純 Java 而不是 Pyspark 中。 我正在嘗試通過 JDBC 將 Spark DataFrame 寫入 Oracle 表。 我能夠成功連接和查詢數據庫,但是當我 go 創建一個像這樣的新表時:

df.write.jdbc('jdbc:oracle:thin:@host:port/service', create_table,
              mode='overwrite',
              properties={'user': 'user', 'password': 'password']})

I get the error message java.sql.SQLException: Invalid column type: getLong not implemented for class oracle.jdbc.driver.T4CRowidAccessor

我懷疑這與df.dtypes bigint的 ROW_ID 列有關。 ROW_ID 類似於下表,似乎與推斷的數據類型不一致。

ROW_ID
AABBVMAGRAAAJfsAAA
AABBVMAGRAAAJftAAA
AABBVMAGRAAJfyAAB
AABBVMAGRAAJfvAAB
AABBVMAGRAAJfwAAB
AABBVMAGRAAJf3AAI

編輯:

我嘗試使用以下方法將數據類型從bigint轉換為string

from pyspark.sql.functions import col
from pyspark.sql.types import StringType
correct_dtypes = df.withColumn('ROW_ID', col('ROW_ID').cast(StringType()))
correct_dtypes.write.jdbc('jdbc:oracle:thin:@host:port/service', create_table,
                          mode='overwrite',
                          properties={'user': 'user', 'password': 'password'})

但我仍然遇到同樣的錯誤。

一種可能的解決方案是在保存期間使用createTableColumnTypes選項,並將麻煩的 bigint 列轉換為 oracle dbs 端的 varchar2:

(correct_dtypes.write.
.option("createTableColumnTypes", "ROW_ID VARCHAR2(18)")
.jdbc('jdbc:oracle:thin:@host:port/service',
                          create_table, mode='overwrite',
                          properties={'user': 'user',
                          'password': 'password'}))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM