一、背景
電腦安裝的kettle工具版本是7.1,由於前一個項目的使用的Mysql8.0的數據庫,所有將lib目錄下mysql連接驅動升級到mysql-connector-java-8.0.26.jar
,當前使用的數據版本是5.7.24。
在整合kettle腳本,發現腳本好多都報錯,具體異常如下:
2022/01/18 23:06:36 - dysjcq.0 - ERROR (version 7.1.0.0-12, build 1 from 2017-05-16 17.18.02 by buildguy) : Unexpected error
2022/01/18 23:06:36 - dysjcq.0 - ERROR (version 7.1.0.0-12, build 1 from 2017-05-16 17.18.02 by buildguy) : org.pentaho.di.core.exception.KettleDatabaseException:
2022/01/18 23:06:36 - dysjcq.0 - Couldn't get row from result set
2022/01/18 23:06:36 - dysjcq.0 -
2022/01/18 23:06:36 - dysjcq.0 - Unable to get value 'Date' from database resultset, index 19
2022/01/18 23:06:36 - dysjcq.0 - HOUR_OF_DAY: 0 -> 1
2022/01/18 23:06:36 - dysjcq.0 -
2022/01/18 23:06:36 - dysjcq.0 -
2022/01/18 23:06:36 - dysjcq.0 - at org.pentaho.di.core.database.Database.getRow(Database.java:2546)
2022/01/18 23:06:36 - dysjcq.0 - at org.pentaho.di.core.database.Database.getRow(Database.java:2516)
2022/01/18 23:06:36 - dysjcq.0 - at org.pentaho.di.trans.steps.tableinput.TableInput.processRow(TableInput.java:148)
2022/01/18 23:06:36 - dysjcq.0 - at org.pentaho.di.trans.step.RunThread.run(RunThread.java:62)
2022/01/18 23:06:36 - dysjcq.0 - at java.lang.Thread.run(Thread.java:745)
2022/01/18 23:06:36 - dysjcq.0 - Caused by: org.pentaho.di.core.exception.KettleDatabaseException:
2022/01/18 23:06:36 - dysjcq.0 - Unable to get value 'Date' from database resultset, index 19
2022/01/18 23:06:36 - dysjcq.0 - HOUR_OF_DAY: 0 -> 1
2022/01/18 23:06:36 - dysjcq.0 -
2022/01/18 23:06:36 - dysjcq.0 - at org.pentaho.di.core.row.value.ValueMetaBase.getValueFromResultSet(ValueMetaBase.java:4964)
2022/01/18 23:06:36 - dysjcq.0 - at org.pentaho.di.core.database.BaseDatabaseMeta.getValueFromResultSet(BaseDatabaseMeta.java:2107)
2022/01/18 23:06:36 - dysjcq.0 - at org.pentaho.di.core.database.DatabaseMeta.getValueFromResultSet(DatabaseMeta.java:2950)
2022/01/18 23:06:36 - dysjcq.0 - at org.pentaho.di.core.database.Database.getRow(Database.java:2538)
2022/01/18 23:06:36 - dysjcq.0 - ... 4 more
2022/01/18 23:06:36 - dysjcq.0 - Caused by: java.sql.SQLException: HOUR_OF_DAY: 0 -> 1
2022/01/18 23:06:36 - dysjcq.0 - at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
2022/01/18 23:06:36 - dysjcq.0 - at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
2022/01/18 23:06:36 - dysjcq.0 - at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
2022/01/18 23:06:36 - dysjcq.0 - at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
2022/01/18 23:06:36 - dysjcq.0 - at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73)
2022/01/18 23:06:36 - dysjcq.0 - at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:85)
2022/01/18 23:06:36 - dysjcq.0 - at com.mysql.cj.jdbc.result.ResultSetImpl.getTimestamp(ResultSetImpl.java:939)
2022/01/18 23:06:36 - dysjcq.0 - at org.pentaho.di.core.row.value.ValueMetaBase.getValueFromResultSet(ValueMetaBase.java:4946)
2022/01/18 23:06:36 - dysjcq.0 - ... 7 more
2022/01/18 23:06:36 - dysjcq.0 - Caused by: com.mysql.cj.exceptions.WrongArgumentException: HOUR_OF_DAY: 0 -> 1
2022/01/18 23:06:36 - dysjcq.0 - at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
2022/01/18 23:06:36 - dysjcq.0 - at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
2022/01/18 23:06:36 - dysjcq.0 - at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
2022/01/18 23:06:36 - dysjcq.0 - at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
2022/01/18 23:06:36 - dysjcq.0 - at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
2022/01/18 23:06:36 - dysjcq.0 - at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
2022/01/18 23:06:36 - dysjcq.0 - at com.mysql.cj.result.SqlTimestampValueFactory.localCreateFromDate(SqlTimestampValueFactory.java:102)
2022/01/18 23:06:36 - dysjcq.0 - at com.mysql.cj.result.SqlTimestampValueFactory.localCreateFromDate(SqlTimestampValueFactory.java:51)
2022/01/18 23:06:36 - dysjcq.0 - at com.mysql.cj.result.AbstractDateTimeValueFactory.createFromDate(AbstractDateTimeValueFactory.java:69)
2022/01/18 23:06:36 - dysjcq.0 - at com.mysql.cj.protocol.a.MysqlTextValueDecoder.decodeDate(MysqlTextValueDecoder.java:77)
2022/01/18 23:06:36 - dysjcq.0 - at com.mysql.cj.protocol.result.AbstractResultsetRow.decodeAndCreateReturnValue(AbstractResultsetRow.java:92)
2022/01/18 23:06:36 - dysjcq.0 - at com.mysql.cj.protocol.result.AbstractResultsetRow.getValueFromBytes(AbstractResultsetRow.java:243)
2022/01/18 23:06:36 - dysjcq.0 - at com.mysql.cj.protocol.a.result.ByteArrayRow.getValue(ByteArrayRow.java:91)
2022/01/18 23:06:36 - dysjcq.0 - ... 9 more
2022/01/18 23:06:36 - dysjcq.0 - Caused by: java.lang.IllegalArgumentException: HOUR_OF_DAY: 0 -> 1
2022/01/18 23:06:36 - dysjcq.0 - at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:2829)
2022/01/18 23:06:36 - dysjcq.0 - at java.util.Calendar.updateTime(Calendar.java:3353)
2022/01/18 23:06:36 - dysjcq.0 - at java.util.Calendar.getTimeInMillis(Calendar.java:1782)
2022/01/18 23:06:36 - dysjcq.0 - at com.mysql.cj.result.SqlTimestampValueFactory.localCreateFromDate(SqlTimestampValueFactory.java:100)
2022/01/18 23:06:36 - dysjcq.0 - ... 15 more
二、異常分析
開始發現異常,在網上尋找解決辦法。大體解決方法都是在url上添加參數如下
- 設置參數
serverTimezone=GMT%2B8
,不起作用。 serverTimezone=Asia/Shanghai
,不起作用。zeroDateTimeBehavior=convertToNull
,不起作用。
后來,有部分數據是可以成功,通過使用 limit
語句,縮小發現,其中一條錯誤數據,只要字段值為1987-04-12就報錯,這個字段是DATE
類型,改成其他值就成功。找不到問題。
猜測可能跟驅動與數據不匹配造成的。驅動版本是8.0.26
,數據庫版本是5.7.24
。后將驅動換回自帶驅動5.1.47
版本。再次運行,異常消失。