2016-03-30 10 views
0

私はSpark DataFrameとして取り込むTIMESTAMP(3)列のMySQLテーブルを持っています。 MySQL JDBCドライバがTIMESTAMP(3)カラムの読み込みに失敗しています。TIMESTAMP(3)列のSpark JDBC DataFrame

構成や効率的な方法がありますか?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) 

スタックトレース:私はMySQLのJDBCドライバのバージョン5.1.6を使用していたことを言及するのを忘れ

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

これを文字列としてプルしてから処理する必要があります – eliasah

+0

どのようにすればよいでしょうか? –

+2

'dbtable'で任意のサブクエリを実行できます。たとえば、http://stackoverflow.com/q/34365692/1560062 – zero323

答えて

0

5.1.38でこの問題はもう表示されません。