Spark JDBC: DataFrameReader не может прочитать таблицу Oracle с типом данных как ROWID - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь прочитать таблицу Oracle, используя spark.read.format, и она прекрасно работает для всех таблиц, кроме нескольких таблиц, в которых любой столбец с типом данных имеет значение ROWID.

Ниже мой код

var df = spark.read.format("jdbc").
        option("url", url).
        option("driver", driver).
        option("dbtable", dbTable).load()
println(df.first)

Я получаю сообщение об ошибке ниже

18/09/08 11:38:17 WARN scheduler.TaskSetManager: Lost task 0.0 in stage 5.0 (TID 23, gbrdsr000002985.intranet.barcapint.com, executor 21): java.sql.SQLException: Invalid column type: getLong not implemented for class oracle.jdbc.driver.T4CRowidAccessor
    at oracle.jdbc.driver.GeneratedAccessor.getLong(GeneratedAccessor.java:440)
    at oracle.jdbc.driver.GeneratedStatement.getLong(GeneratedStatement.java:228)
    at oracle.jdbc.driver.GeneratedScrollableResultSet.getLong(GeneratedScrollableResultSet.java:620)
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$makeGetter$8.apply(JdbcUtils.scala:365)
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$makeGetter$8.apply(JdbcUtils.scala:364)

Анализ: я проверил JdbcUtils объект и обнаружил, что case java.sql.Types.ROWID сопоставлен с LongType spark. Но getLong не реализован для типа ROWID в драйвере Oracle JDBC. Я уверен, что если мне удастся сопоставить его со StringType, то это сработает, но я не смог найти обходного пути для этого. Пожалуйста, предложите решение здесь.

На данный момент я читаю данные с помощью ResultSet, а затем преобразовываю их в DataFrame с помощью пользовательской схемы, но это убивает параллелизм. Также хотел проверить, есть ли возможность изменить код JdbcUtils, так как я не могу расширить DataFrameReader для создания пользовательского, так как «private [sql]» упоминается в определении класса.

...