Spark JDBC DataFrame со столбцом TIMESTAMP(3)

У меня есть таблица MySQL со столбцом TIMESTAMP(3), которую я хочу использовать как Spark DataFrame. Драйвер MySQL JDBC не может прочитать столбец TIMESTAMP(3).

Есть ли конфигурация или эффективный способ указать свой собственный Encoder для правильного анализа этого столбца?

Схема:

CREATE TABLE table_x
(
    user_id VARCHAR(255) NOT NULL,
    item_id VARCHAR(255) NOT NULL,
    serialized_item MEDIUMTEXT NOT NULL,
    creation_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP' NOT NULL,
    last_updated_date TIMESTAMP(3) DEFAULT 'CURRENT_TIMESTAMP(3)' NOT NULL
);

Код:

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.types._

val conf = new SparkConf().
  setMaster("local[4]").
  setAppName("AppName")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
import sqlContext.implicits._

val props = new Properties()
props.setProperty("user", "...")
props.setProperty("password", "...")
val df = sqlContext.read.jdbc("...", "table_x", props)
df.take(10).foreach(println)

Трассировки стека:

java.sql.SQLException: Cannot convert value '2016-03-30 09:41:03.043' from column 6 to TIMESTAMP.
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
        at com.mysql.jdbc.ResultSetRow.getTimestampFast(ResultSetRow.java:1321)
        at com.mysql.jdbc.BufferRow.getTimestampFast(BufferRow.java:573)
        at com.mysql.jdbc.ResultSetImpl.getTimestampInternal(ResultSetImpl.java:6617)
        at com.mysql.jdbc.ResultSetImpl.getTimestamp(ResultSetImpl.java:5943)
        ...
Caused by: java.lang.IllegalArgumentException: nanos > 999999999 or < 0
        at java.sql.Timestamp.setNanos(Timestamp.java:389)
        at com.mysql.jdbc.TimeUtil.fastTimestampCreate(TimeUtil.java:1135)
        at com.mysql.jdbc.ResultSetImpl.fastTimestampCreate(ResultSetImpl.java:1030)
        at com.mysql.jdbc.ResultSetRow.getTimestampFast(ResultSetRow.java:1310)
        ...

person Cem Catikkas    schedule 30.03.2016    source источник
comment
Вам нужно будет потянуть его как строку и потом обработать   -  person eliasah    schedule 30.03.2016
comment
Любые указатели на то, как я могу это сделать?   -  person Cem Catikkas    schedule 30.03.2016
comment
Вы можете выполнить произвольный подзапрос в файле dbtable. См., например, stackoverflow.com/q/34365692/1560062   -  person zero323    schedule 30.03.2016
comment
Фактически переход на последнюю версию драйвера MySQL JDBC (версия 5.1.38) решил эту проблему. Я должен был проверить это раньше.   -  person Cem Catikkas    schedule 31.03.2016
comment
@CemCatikkas Вы должны опубликовать это как ответ. Это может быть полезной информацией, и ее легко можно потерять из комментариев.   -  person zero323    schedule 31.03.2016


Ответы (1)


Я забыл упомянуть, что использовал драйвер MySQL JDBC версии 5.1.6.

Я больше не вижу этой проблемы с 5.1.38.

person Cem Catikkas    schedule 31.03.2016