2016-03-30 15 views
0

Ich habe eine MySQL-Tabelle mit einer TIMESTAMP(3) Spalte, die ich als Spark DataFrame ziehen möchte. Der MySQL JDBC-Treiber kann die Spalte TIMESTAMP(3) nicht lesen.Spark JDBC DataFrame mit TIMESTAMP (3) Spalte

Gibt es eine Konfiguration oder einen effizienten Weg, kann ich meine eigene Encoder angeben, um diese Spalte korrekt zu analysieren?

Schema:

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 
); 

Code:

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) 

Stacktrace:

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) 
     ... 
+0

Sie müssen es als String ziehen und danach bearbeiten – eliasah

+0

Irgendwelche Hinweise, wie ich das tun kann? –

+2

Sie können eine beliebige Unterabfrage in der 'dbtable' ausführen. Siehe zum Beispiel http://StackOverflow.com/q/34365692/1560062 – zero323

Antwort

0

Ich vergaß zu erwähnen, dass ich mit MySQL JDBC-Treiber Version 5.1.6.

Ich sehe dieses Problem nicht mehr mit 5.1.38.