Запись Spark DataFrame в JDBC - Не удается получить тип JDBC для struct <date: int, day: int ...>? - PullRequest
0 голосов
/ 02 сентября 2018

Я новичок в спарке, и пытался записать фрейм данных в таблицу db2. Я получаю ошибку:

Exception in thread "main" java.lang.IllegalArgumentException: Can't get JDBC type for struct <data:int, day:int, hours:int, minutes:int, month:int, seconds:int, time:bigint, timeZoneOffset:int, year:int>

Моя схема базы данных

localId <-- Integer type
effectiveDate <-- Timestamp
activityDate <-- Timestamp
inDate <-- Timestamp
outDate <-- Timestamp

Я создал класс POJO для моей таблицы БД, который выглядит следующим образом

public class StowageTable {
    private long localId;
    private Date effectiveDate;
    private Date activityDate;
    private Date inDate;
    private Date outDate;
    //setters and getters
}

Затем я в основном читаю csv, который имеет ту же схему, что и таблица db, следующим образом:

JavaRDD<String> dataFromCSV = javaSparkContext.textFile(fileURL);
//The I create a JavaRDD of the POJO type
JavaRDD<StowageTable> dataToPOJO = dataFromCSV.map((Function<String,  StowageTable) line -> {
    String[] fields = line.split(",");
    StowageTable st = createNewStowageTable(fields);
    return st;
});
//converting the RDD to DataFrame
DataFrame stowageTableDF = sqlContext.createDataFrame(dataToPOJO, StowageTable.class);
//call jdbc persister
persistToTable(stowageTableDF);

Мой persistToTable(DataFrame df) метод выглядит следующим образом:

private void persistToTable(DataFrame df) {
    Class.forName("")//driver here
    //skipping a few lines for brevity
    df.write().mode(SaveMode.Append).jdbc(url, table, connectionProperties);
}

Я нашел несколько решений здесь: Запись Spark DataFrame в JDBC - Невозможно получить тип JDBC для массива > и java.lang.IllegalArgumentException: не удается получить тип JDBC для массива но не смог найти что-либо, что решает проблему типа данных дата-время. Пожалуйста, предложите мне какое-нибудь решение. Я на спарке 1.6.3.

1 Ответ

0 голосов
/ 12 сентября 2018

Так как я пока не мог найти никакого ответа, и тем временем нашел решение для себя, вот основная идея. Если база данных имеет тип данных как Timestamp, тогда вам нужно использовать Timestamp в POJO объекта, а затем преобразовать эту Timestamp в structtype spark.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...