[英]Invalid column type: getInt not implemented for class oracle.jdbc.driver.T4CRowidAccessor
[英]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.