文件導入導出
Hop眺: 就是步驟之間帶箭頭的連線,眺定義了步驟之間的數據通路。跳實際是兩個步驟之間的被稱爲——行集的數據緩存,在流程運行過程中數據會先往hop中寫。當行集滿了,向行集數據寫入數據就會停止,知道行集裏又有了空間。當行集空了,從行集讀取數據的步驟會停止,直到行集裏又有了可讀的數據。行集的大小可以在轉換的設置裏進行設置,如下圖:
kettle核心概念:
轉換: 轉換是ETL解決方案中最主要的部分,它處理抽取、轉換、加載各種對數據行操作。 轉換包含一個或者多個步驟,如讀取文件、過濾數據行、數據清洗或將數據加載到數據庫。 轉換中的步驟通過 跳(hop)來鏈接,跳定義一個單向通道,允許數據從一個步驟向另一個步驟流動。
數據流:在kettle 中,數據的單位是行,數據流就是數據行從一個步驟到另一個步驟的移動,一個數據行是零到多個字段的集 合。數據流也被稱爲記錄流。
step 步驟: 步驟(控件)是轉換中的基本組成部分;
步驟的關鍵特性:
1、步驟需要有一個整個轉換過程中唯一的名字;
2、每個步驟都會讀、寫數據行(唯一例外的是“生成記錄”步驟,該步驟只寫數據);
3、 步驟將數據寫到與之相連的一個或多個輸出跳,再傳送到跳的另一端的步驟;
4、 大多數的步驟都可以有多個輸出跳。一個步驟的數據發送可以被設置爲分發和複製,分發是目標步驟輪流接收記 錄,複製是所有的記錄被同時發送到所有的目標步驟。
hop跳:就是步驟之間帶箭頭的連線,眺定義了步驟之間的數據通路。跳實際是兩個步驟之間的被稱爲——行集的數據緩存,在 流程運行過程中數據會先往hop中寫。當行集滿了,向行集數據寫入數據就會停止,知道行集裏又有了空間。當行集空 了,從行集讀取數據的步驟會停止,直到行集裏又有了可讀的數據
kettle中數據行中數據類型:
1 String 字符類型數據
2 Number 雙精度浮點數
3 Integer 帶符號長整型(64位)
4 BigNumber 任意精度數據
5 Date 帶毫秒精度的日期時間值
6 Boolean 取值爲true和false的布爾值
7 Binary 二進制字段可以包含圖像、聲音、視頻及其他類型的二進制數據
數據行——元數據:
連接數據庫
問題:
鏈接數據庫報錯:
錯誤連接數據庫 [localtest] : org.pentaho.di.core.exception.KettleDatabaseException:
Error occurred while trying to connect to the database
Driver class 'org.gjt.mm.mysql.Driver' could not be found, make sure the 'MySQL' driver (jar file) is installed.
org.gjt.mm.mysql.Driver
org.pentaho.di.core.exception.KettleDatabaseException:
Error occurred while trying to connect to the database
Driver class 'org.gjt.mm.mysql.Driver' could not be found, make sure the 'MySQL' driver (jar file) is installed.
org.gjt.mm.mysql.Driver
at org.pentaho.di.core.database.Database.normalConnect(Database.java:477)
at org.pentaho.di.core.database.Database.connect(Database.java:373)
at org.pentaho.di.core.database.Database.connect(Database.java:344)
at org.pentaho.di.core.database.Database.connect(Database.java:334)
at org.pentaho.di.core.database.DatabaseFactory.getConnectionTestReport(DatabaseFactory.java:83)
at org.pentaho.di.core.database.DatabaseFactory.getConnectionTestResults(DatabaseFactory.java:112)
at org.pentaho.di.core.database.DatabaseMeta.testConnectionSuccess(DatabaseMeta.java:2843)
at org.pentaho.ui.database.event.DataHandler.testDatabaseConnection(DataHandler.java:631)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.pentaho.ui.xul.impl.AbstractXulDomContainer.invoke(AbstractXulDomContainer.java:313)
at org.pentaho.ui.xul.impl.AbstractXulComponent.invoke(AbstractXulComponent.java:157)
at org.pentaho.ui.xul.impl.AbstractXulComponent.invoke(AbstractXulComponent.java:141)
at org.pentaho.ui.xul.swt.tags.SwtButton.access$500(SwtButton.java:43)
at org.pentaho.ui.xul.swt.tags.SwtButton$4.widgetSelected(SwtButton.java:137)
at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Display.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
at org.eclipse.jface.window.Window.runEventLoop(Window.java:820)
at org.eclipse.jface.window.Window.open(Window.java:796)
at org.pentaho.di.ui.xul.KettleDialog.show(KettleDialog.java:89)
at org.pentaho.di.ui.xul.KettleDialog.show(KettleDialog.java:56)
at org.pentaho.di.ui.core.database.dialog.XulDatabaseDialog.open(XulDatabaseDialog.java:117)
at org.pentaho.di.ui.core.database.dialog.DatabaseDialog.open(DatabaseDialog.java:61)
at org.pentaho.di.ui.repo.controller.RepositoryConnectController.lambda$createConnection$1(RepositoryConnectController.java:136)
at org.eclipse.swt.widgets.RunnableLock.run(Unknown Source)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Unknown Source)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Unknown Source)
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
at org.pentaho.di.ui.repo.dialog.RepositoryDialog.open(RepositoryDialog.java:96)
at org.pentaho.di.ui.repo.dialog.RepositoryDialog.open(RepositoryDialog.java:77)
at org.pentaho.di.ui.repo.dialog.RepositoryDialog.open(RepositoryDialog.java:73)
at org.pentaho.di.ui.repo.dialog.RepositoryDialog.openCreation(RepositoryDialog.java:110)
at org.pentaho.di.ui.repo.menu.RepositoryConnectMenu$1.widgetSelected(RepositoryConnectMenu.java:122)
at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Display.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
at org.pentaho.di.ui.spoon.Spoon.readAndDispatch(Spoon.java:1384)
at org.pentaho.di.ui.spoon.Spoon.waitForDispose(Spoon.java:7949)
at org.pentaho.di.ui.spoon.Spoon.start(Spoon.java:9331)
at org.pentaho.di.ui.spoon.Spoon.main(Spoon.java:710)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.pentaho.commons.launcher.Launcher.main(Launcher.java:92)
Caused by: org.pentaho.di.core.exception.KettleDatabaseException:
Driver class 'org.gjt.mm.mysql.Driver' could not be found, make sure the 'MySQL' driver (jar file) is installed.
org.gjt.mm.mysql.Driver
at org.pentaho.di.core.database.Database.connectUsingClass(Database.java:520)
at org.pentaho.di.core.database.Database.normalConnect(Database.java:461)
... 53 more
Caused by: java.lang.ClassNotFoundException: org.gjt.mm.mysql.Driver
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.pentaho.di.core.database.Database.connectUsingClass(Database.java:495)
... 54 more
主機名 : localhost
端口 : 3306
數據庫名:test
配置數據庫鏈接成功後需要在kettle上登錄
***這裏的 user name 和 password 都是默認的admin,不是數據庫鏈接的用戶名和密碼
登錄成功後可以在操作區看到如下圖:
原來test數據庫中就只有紅框內的,連接後會多很多表
kettle的連接組件
Multiway merge join:
合併記錄:
排序記錄:
記錄關聯(笛卡爾輸出):
記錄集連接:
單表輸入輸出
創建數據庫的表連接輸入輸出 數據庫間的輸入輸出,可以是同類型數據庫之間的數據抽取和轉換比如oracle到oracle的數據抽取,也可以是不同數據庫之間的抽取,例如mysql到oracle。先來一個簡單的示例,我在mysql數據庫中新建了幾張表有數據,在oracle只有相同的表結構,把mysql中的數據抽取到oracle的數據中。
從轉換中的【輸入】中拖出一個 表輸入 ,從【輸出】中拖出一個表輸出,用連接線連起來,然後配置表的數據庫鏈接。
點擊運行就可以運行成功:
多表合併輸出
兩表合併-使用Multiway merge join:
排序相反的情況:
在兩表合併過程中有幾點需要注意的內容:
1 有時需要多執行幾次(這個是我自己總結的,不知道對不對,因爲相同的配置我執行一次報錯,在第二次就成功了)
2 執行成功後,去數據庫裏驗證數據,需要稍等下,不要因爲看不到就認爲沒成功
3 排序 如果需要正確全量數據,就需要保持排序一致,要麼都是升序要麼都是降序
兩表合併-使用記錄集連接:
錯誤示例:
有人可能會有疑問,拿的到的數據是正確的,又怎麼能說上面示例是錯誤的呢。這種屬於特殊情況,這種情況是我的兩張源表都是升序的排列方式,排序保持了一致。所以得到的結果跟在過程中給兩張表添加了排序組件是一樣的效果,爲了驗證,把teacher表中部分數據調整了順序。得到的測試結果是:
看到這應該瞭解了。這種錯誤示例能順利執行的,執行過程中不會報錯,但是有可能得到的數據結果不是預期的結果
正確的示例:
數據庫執行結果:
三表連接:
三表連接跟兩表連接思想一致
我想根據學生id排序,看着順眼點
kettle的操作暫時停止