kettle類型轉換或者不同類型的比較


今天kettle“突然”不能正常工作了:源中的新數據沒有新增到目標數據庫。

想來想去,我曾經把目標表的user_id字段從decimal改為VARCHAR(10),所以kettle在識別關鍵字、進行比較時,出現了問題。

那么為何最開始沒有出問題呢?——最開始時目標表是空的,所以一次性新增了過去。(標黃色,可能是這個原因)

那么就是數字和Null可以進行比較,而數字和字符無法進行比較?——比如目標表是空的,可以新增1001為'1001'。而再次比較1001和'1001'時則報錯,轉換就直接終止了:當源新增1002時,無法在目標中新增'1002'。

那么如何解決這個類型不一致的比較問題呢?想了想,這不是kettle應該解決的問題,SQL應該支持這種轉換,在MySQL的文檔中找到了轉換的方法:

CAST(DEALER_ID AS CHAR(10)) AS DEALER_ID (奇怪的是為何使用CHAR這個名字而不是統一為VARCHAR——我也太多慮了)。

與其猜測某些原因,不如翻看日志(這讓我找到了真正的解釋),日志應該是第一時間想到的:

轉換錯誤的日志:

2021/12/10 15:06:07 - Kitchen - Logging is at level : 基本日志
2021/12/10 15:06:07 - Kitchen - Start of run.
2021/12/10 15:06:13 - dms2fr_wechat - 開始執行任務
2021/12/10 15:06:13 - dms2fr_wechat - 開始項[get_var]
2021/12/10 15:06:13 - get_var - Using run configuration [Pentaho local]
2021/12/10 15:06:13 - get_var - Using legacy execution engine
2021/12/10 15:06:13 - get_var - 為了轉換解除補丁開始 [get_var]
2021/12/10 15:06:13 - get_var.0 - Finished reading query, closing connection.
2021/12/10 15:06:13 - get_var.0 - 完成處理 (I=1, O=0, R=0, W=1, U=0, E=0)
2021/12/10 15:06:13 - var_sync_time.0 - Setting environment variables...
2021/12/10 15:06:13 - var_sync_time.0 - Set variable var_sync_time to value [2021/12/10 14:53:10.000000000]
2021/12/10 15:06:13 - var_sync_time.0 - Finished after 1 rows.
2021/12/10 15:06:13 - var_sync_time.0 - 完成處理 (I=0, O=0, R=1, W=1, U=0, E=0)
2021/12/10 15:06:13 - dms2fr_wechat - 開始項[update_sync_time]
2021/12/10 15:06:14 - dms2fr_wechat - 開始項[dms2fr]
2021/12/10 15:06:14 - dms2fr - Using run configuration [Pentaho local]
2021/12/10 15:06:14 - dms2fr - Using legacy execution engine
2021/12/10 15:06:14 - dms2fr_wechat - 為了轉換解除補丁開始 [dms2fr_wechat]
2021/12/10 15:06:14 - dt_vs_finance_pay.0 - Finished reading query, closing connection.
2021/12/10 15:06:14 - dt_bb_dealers.0 - Finished reading query, closing connection.
2021/12/10 15:06:14 - dt_bb_dealers.0 - 完成處理 (I=625, O=0, R=0, W=625, U=0, E=0)
2021/12/10 15:06:14 - user.0 - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-11-14 10.30.55 by buildguy) : Error in step, asking everyone to stop because of:
2021/12/10 15:06:14 - user.0 - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-11-14 10.30.55 by buildguy) : org.pentaho.di.core.exception.KettleDatabaseException:
2021/12/10 15:06:14 - user.0 - Error inserting/updating row
2021/12/10 15:06:14 - user.0 - Data truncation: Truncated incorrect DOUBLE value: 'J211184'
2021/12/10 15:06:14 - user.0 -
2021/12/10 15:06:14 - user.0 - at org.pentaho.di.core.database.Database.insertRow(Database.java:1319)
2021/12/10 15:06:14 - user.0 - at org.pentaho.di.core.database.Database.insertRow(Database.java:1243)
2021/12/10 15:06:14 - user.0 - at org.pentaho.di.core.database.Database.insertRow(Database.java:1231)
2021/12/10 15:06:14 - user.0 - at org.pentaho.di.trans.steps.insertupdate.InsertUpdate.lookupValues(InsertUpdate.java:163)
2021/12/10 15:06:14 - user.0 - at org.pentaho.di.trans.steps.insertupdate.InsertUpdate.processRow(InsertUpdate.java:299)
2021/12/10 15:06:14 - user.0 - at org.pentaho.di.trans.step.RunThread.run(RunThread.java:62)
2021/12/10 15:06:14 - user.0 - at java.lang.Thread.run(Thread.java:748)
2021/12/10 15:06:14 - user.0 - Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: 'J211184'
2021/12/10 15:06:14 - user.0 - at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4185)
2021/12/10 15:06:14 - user.0 - at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4119)
2021/12/10 15:06:14 - user.0 - at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)
2021/12/10 15:06:14 - user.0 - at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
2021/12/10 15:06:14 - user.0 - at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2799)
2021/12/10 15:06:14 - user.0 - at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2139)
2021/12/10 15:06:14 - user.0 - at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2442)
2021/12/10 15:06:14 - user.0 - at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
2021/12/10 15:06:14 - user.0 - at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2343)
2021/12/10 15:06:14 - user.0 - at org.pentaho.di.core.database.Database.insertRow(Database.java:1286)
2021/12/10 15:06:14 - user.0 - ... 6 more
2021/12/10 15:06:14 - dms2fr_wechat - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-11-14 10.30.55 by buildguy) : 錯誤被檢測到!
2021/12/10 15:06:14 - user.0 - 完成處理 (I=203, O=0, R=203, W=202, U=0, E=1)
2021/12/10 15:06:14 - Carte - Installing timer to purge stale objects after 1440 minutes.
2021/12/10 15:06:14 - dms2fr_wechat - 轉換被檢測
2021/12/10 15:06:14 - dms2fr_wechat - 轉換正在殺死其他步驟!
2021/12/10 15:06:14 - dms2fr_wechat - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-11-14 10.30.55 by buildguy) : 錯誤被檢測到!
2021/12/10 15:06:14 - dms2fr_wechat - 完成作業項[dms2fr] (結果=[false])
2021/12/10 15:06:14 - dms2fr_wechat - 完成作業項[update_sync_time] (結果=[false])
2021/12/10 15:06:14 - dms2fr_wechat - 完成作業項[get_var] (結果=[false])
2021/12/10 15:06:14 - dms2fr_wechat - 任務執行完畢
2021/12/10 15:06:14 - Kitchen - Finished!
2021/12/10 15:06:14 - Kitchen - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-11-14 10.30.55 by buildguy) : Finished with errors
2021/12/10 15:06:14 - Kitchen - Start=2021/12/10 15:06:07.765, Stop=2021/12/10 15:06:14.868
2021/12/10 15:06:14 - Kitchen - Processing ended after 7 seconds.

改正后的日志:

2021/12/10 15:33:08 - Kitchen - Logging is at level : 基本日志
2021/12/10 15:33:08 - Kitchen - Start of run.
2021/12/10 15:33:13 - dms2fr_wechat - 開始執行任務
2021/12/10 15:33:13 - dms2fr_wechat - 開始項[get_var]
2021/12/10 15:33:14 - get_var - Using run configuration [Pentaho local]
2021/12/10 15:33:14 - get_var - Using legacy execution engine
2021/12/10 15:33:14 - get_var - 為了轉換解除補丁開始 [get_var]
2021/12/10 15:33:14 - get_var.0 - Finished reading query, closing connection.
2021/12/10 15:33:14 - get_var.0 - 完成處理 (I=1, O=0, R=0, W=1, U=0, E=0)
2021/12/10 15:33:14 - var_sync_time.0 - Setting environment variables...
2021/12/10 15:33:14 - var_sync_time.0 - Set variable var_sync_time to value [2021/12/10 15:20:09.000000000]
2021/12/10 15:33:14 - var_sync_time.0 - Finished after 1 rows.
2021/12/10 15:33:14 - var_sync_time.0 - 完成處理 (I=0, O=0, R=1, W=1, U=0, E=0)
2021/12/10 15:33:14 - dms2fr_wechat - 開始項[update_sync_time]
2021/12/10 15:33:14 - dms2fr_wechat - 開始項[dms2fr]
2021/12/10 15:33:14 - dms2fr - Using run configuration [Pentaho local]
2021/12/10 15:33:14 - dms2fr - Using legacy execution engine
2021/12/10 15:33:14 - dms2fr_wechat - 為了轉換解除補丁開始 [dms2fr_wechat]
2021/12/10 15:33:14 - dt_vs_finance_pay.0 - Finished reading query, closing connection.
2021/12/10 15:33:14 - dt_bb_dealers.0 - Finished reading query, closing connection.
2021/12/10 15:33:14 - dt_bb_dealers.0 - 完成處理 (I=625, O=0, R=0, W=625, U=0, E=0)
2021/12/10 15:33:15 - user.0 - 完成處理 (I=625, O=0, R=625, W=625, U=0, E=0)
2021/12/10 15:33:15 - Carte - Installing timer to purge stale objects after 1440 minutes.
2021/12/10 15:33:15 - dms2fr_wechat - 完成作業項[dms2fr] (結果=[true])
2021/12/10 15:33:15 - dms2fr_wechat - 完成作業項[update_sync_time] (結果=[true])
2021/12/10 15:33:15 - dms2fr_wechat - 完成作業項[get_var] (結果=[true])
2021/12/10 15:33:15 - dms2fr_wechat - 任務執行完畢
2021/12/10 15:33:15 - Kitchen - Finished!
2021/12/10 15:33:15 - Kitchen - Start=2021/12/10 15:33:08.119, Stop=2021/12/10 15:33:15.957
2021/12/10 15:33:15 - Kitchen - Processing ended after 7 seconds.

 

結論:kettle可以自動進行數字和字符串的比較,前提是這個字符串要能夠轉換為數字;但正確的做法是顯式轉換。(同樣,日期和字符串的比較應該類似,但不常見。)

它是以源中的數據類型(decimal)為基礎,將目標中的類型(CHAR)轉換為源中的類型。

我更改類型本來就是基於兼容的考慮,要從其他渠道新增以字母開頭的用戶ID;現在kettle識別'J211184',將其轉為數字時拋出了異常。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM