【问题标题】:Spark DataFrame write to JDBC - Can't get JDBC type for struct <date:int, day:int...>?Spark DataFrame 写入 JDBC - 无法获取 struct <date:int, day:int...> 的 JDBC 类型?
【发布时间】:2019-02-07 18:49:07
【问题描述】:

我是 spark 新手,正在尝试将数据帧写入 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
}

然后我基本上读取了一个与 db 表具有相同架构的 csv,如下所示:

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 write to JDBC - Can't get JDBC type for array<array<int>> 和java.lang.IllegalArgumentException: Can't get JDBC type for array<string> 但无法找到任何解决日期时间数据类型问题的方法。请给我一些解决方案。我正在使用 spark 1.6.3。

【问题讨论】:

  • 它说can't get JDBC type for struct 你能执行df.printSchema() 看看列是否正确映射?

标签: java apache-spark exception jdbc apache-spark-sql


【解决方案1】:

由于我还没有找到任何答案,同时为自己找到了解决方案,所以这里是基本的想法。如果数据库的数据类型为 Timestamp,则必须在对象的 POJO 中使用 Timestamp,然后将该 Timestamp 转换为 spark 的 structtype。

【讨论】:

  • 你也可以使用 java.sql.Date
  • 正如@Hasson 所说,使用 java.sql.Date 确实有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 2018-05-18
  • 2018-04-18
  • 2020-03-08
相关资源
最近更新 更多