目錄
1、打開plugins\pentaho-big-data-plugin\plugin.properties 文件
21、Test21 JS腳本(使用Kettle生成日期維度數據)
一、Kettle安裝、配置
環境要求:
- 安裝、配置好JDK
1、下載Kettle
2、解壓Kettle
3、雙擊spoon.bat 啓動spoon
4、操作和mysql相關的的需要在lib目錄下導入mysql驅動包
二、Kettle的使用(輸入輸出組件)
Kettle數據流結構圖
1、Test1 csv-excel
- 在Kettle中新建轉換
- 拖拽一個CSV輸入組件、一個Excel輸出組件、並按住Shift拖動鼠標連接兩個組件
- 配置CSV輸入組件、Excel輸出組件
- 選擇要進行導入的CSV數據源
- 點擊 「獲取字段」,讀取CSV中的列
- 點擊 「預覽」,瀏覽CSV中的數據
- 指定輸出Excel文件的位置
- 點擊 三角形 箭頭執行
2、Test2 json-excel
輸入
輸出
點擊啓動
3、Test3 mysql -excelx
輸入
、點擊測試會出現以下彈框
點擊瀏覽
輸出
執行
結果
4、Test4 生成數據-excel
輸入
輸出
執行
結果
5、mysql –文本
輸入
輸出
執行
結果
6、Test6 json –mysql
輸入
輸出
目標表可以隨便填寫一個數據庫中不存在的表名,之後再SQL那裏可以創建
獲取字段沒有反應的話,先點確定,之後看一下輸入輸出步驟是否處於連接狀態
在未連接狀態是獲取不了字段的
在連接狀態下可以獲取字段
執行
結果
7、json –插入/更新(mysql)
輸入
輸出
執行
結果
插入(和上邊不同的只有以下內容)
!!好像是第一次執行只會插入表結構,第二次執行纔會插入json中的數據!!
8、Test8 mysql 刪除數據
輸入
輸出
執行
結果
三、Kettle整合Hadoop
修改配置:
1、打開plugins\pentaho-big-data-plugin\plugin.properties 文件
修改 active.hadoop.configuration 爲 active.hadoop.configuration=cdh514
!!這裏的cdh514要根據你自己的hadoop版本來寫!!
不修改這裏的配置可能出現的錯誤
The Active Shim has not been set
此時會彈出 hadoop 版本的基本信息
2、把集羣中的core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml文件拷貝(替換)到kettle的pdi-ce-8.2.0.0-342\data-integration\plugins\pentaho-big-data-plugin\hadoop-configurations\cdh514目錄下
不修改以上配置可能出現以下錯誤
We couldn't run test User Home Directory Access.
We couldn't run test Root Directory Access.
kettle Unable to load the{0} Shim.
9、Test9 HDFS –excel
輸入
輸出
10、Test10 json -HDFS
輸入
輸出
四、Kettle整合Hive
sz /export/servers/hadoop-2.6.0-cdh5.14.0/share/hadoop/common/hadoop-common-2.6.0-
cdh5.14.0.jar
2、把jar包放置在\data-integration\lib目錄下
11、Test11 hive- –excel
hive數據庫是通過jdbc來進行連接,可以通過表輸入控件來獲取數據
準備大數據Hive環境,創建數據表。
準備數據,將數據加載到hive
hive --service hiveserver2 &
hive --service metastore &
1、連接hive
create database test;
use test;
3、創建表
create table a(
a int,
b int
)
row format delimited fields terminated by ',' stored as TEXTFILE;
show tables;
4、創建數據文件
1,11
2,22
3,33
5、 從文件加載數據到表
load data local inpath '/root/a.txt' into table a;
6、查詢表
select * from a;
輸入
輸出
12、Test12 excel-hive
把數據保存到hive數據庫hive數據庫是通過jdbc來進行連接,可以通過表輸出控件來保存數 據。
輸入
輸出
查看
執行
結構
13、Test13 SQL腳本(Hive)
Kettle中可以執行Hive的HiveSQL語句,使用作業的SQL腳本。
五、Kettle轉換組件
轉換是ETL的T,T就是 Transform清洗、轉換 ETL三個部分中,T花費時間最 長,是“一般情況下這部分工作 量是整個ETL的2/3
14、Test14 值映射json-excel
值映射就是把字段的一個值映射成其他的值
結果
15、Test15 增加序列json-excel
增加序列就是給數據流增加一個序列字段
16、Test16選擇字段json-excel
字段選擇是從數據流中選擇字段、改變名稱、修改數據類型
六、Kettle流程控件
流程主要用來控制數據流程和數據流向
17、Test17 switch
switch/case組件讓數據流從一路到多路。
18、過濾
過濾記錄讓數據流從一路到兩路。
七、Kettele連接控件
19、Test19 連接控件-笛卡爾積
20、Test20 記錄集連接
記錄集連接類似數據庫的左連接、右連接、內連接、外連接。在進行記錄集連接之前,應該要對記錄集進行排序。
八、Kettle Javascript腳本組件
- Kettle中可以通過腳本完成一些複雜的操作
- javascript腳本就是使用javascript語言通過代碼編程來完成對數據流的操作
- JS中有很多內置函數,可以在編寫JS代碼時查看
- 存在兩種不同的模式不兼容模式和兼容模式
-
不兼容模式:是默認的,也是推薦的
-
兼容模式:兼容老版本的kettle
對比不兼容模式與兼容模式的差別:
操作
|
不兼容模式 | 兼容模式 |
獲取字段 | myVar = fifieldName |
myVar = 字段名稱.getString() myVar = 字段名稱.getNumber() |
給字段賦值 | 字段名 = myVar | 字段名.setValue(myVar) |
在腳本中使用java類 | var myVar = new java.lang.String("pentahochina.com") | var myVar = new Packages.java.lang.String("pentahochina.com") |
21、Test21 JS腳本(使用Kettle生成日期維度數據)
需求:
名 | 類型 | 示例值 | 中文名 |
---|---|---|---|
date_key | string | 20000101 | 代理鍵 |
date_value | string | 2000-01-01 | 年-月-日 |
day_in_year | string | 1 | 當年的第幾天 |
day_in_month | string | 1 | 當月的第幾天 |
is_first_day_in_month | string | y | 是否月的第一天 |
is_last_day_in_month | string | n | 是否月的最後一天 |
weekday | string | 星期一 | 星期 |
week_in_month | string | 1 | 月的第幾個星期 |
is_first_day_in_week | string | y、n | 是否週一 |
is_dayoff | string | y、n | 是否休息日 |
is_workday | string | y、n | 是否工作日 |
is_holiday | string | y、n | 是否國家法定節假日 |
date_type | string | workday、weekend、holiday 工作日、週末、法定節假日 | 日期類型 工作日:workday 國家法定節假日:holiday 休息日:weekend |
month_number | string | 1、2、..、12 | 月份 |
year | string | 2000 | 年份 |
quarter_name | string | Q1 | 季度名稱 |
quarter_number | string | 1 | 季度 |
year_quarter | string | 2000-Q1 | 年-季度 |
year_month_number | string | 2000-01 | 年-月份 |
使用Kettle構建以下組件結構圖
-
生成記錄
-
增加序列
-
Javascript代碼
-
Http Client組件(5個並行度)
-
JSON Input
-
Switch/case
-
字段映射爲常量
-
工作日
-
法定節假日
-
節假日調休補班
-
休息日
-
-
字段選擇
-
Hadoop File Output
組件配置
1、生成記錄組件
2、配置增加序列組件
3、Javascript組件,生成基本時間維度數據
//初始日期
var initStr = "2019-01-01";
//轉爲日期對象
var dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd");
var initDate = dateFormat.parse(initStr);
//獲取日曆對象
var calendar = java.util.Calendar.getInstance();
//設置日曆的時間就是我們的初始時間
calendar.setTime(initDate);
//使用日曆加減天,變換日期
calendar.add(java.util.Calendar.DAY_OF_MONTH, setup);
//獲取增加一天之後的日期
var newDate = calendar.getTime();
var date_value = dateFormat.format(newDate);
dateFormat.applyPattern("yyyyMMdd");
var date_key = dateFormat.format(newDate);
//一年當中第幾天?
var day_in_year = calendar.get(java.util.Calendar.DAY_OF_YEAR)+"";
//一月當中第幾天
var day_in_month = calendar.get(java.util.Calendar.DAY_OF_MONTH)+"";
//是否是月的第一天
var is_first_day_in_month = "n";
if (day_in_month.equals("1")) {
is_first_day_in_month = "y";
}
//是否是月的最後一天
var is_last_day_in_month = "n";
calendar.add(java.util.Calendar.DAY_OF_MONTH, 1);
var nextDay = calendar.get(java.util.Calendar.DAY_OF_MONTH) + "";
if (nextDay.equals("1")) {
is_last_day_in_month = "y";
}
//注意增加之後的日曆對象需要再減回去
calendar.add(java.util.Calendar.DAY_OF_MONTH, -1);
//星期幾
var weekday= (calendar.get(java.util.Calendar.DAY_OF_WEEK)-1)+"";
//星期日:1,星期六是7
if(weekday.equals("0")){
weekday="7";
}
//獲取月中第幾周,先減一保證時間正確(我們的規則)
calendar.add(java.util.Calendar.DAY_OF_MONTH, -1);
var week_in_month = calendar.get(java.util.Calendar.WEEK_OF_MONTH)+"";
//再增加回去
calendar.add(java.util.Calendar.DAY_OF_MONTH, 1);
//是否是週一
var is_first_day_in_week = "n";
if (weekday.equals("1")) {
is_first_day_in_week = "y";
}
var is_dayoff = "n";
var is_workday = "n";
var is_holiday = "n";
var date_type = "workday";
//定義查詢的url
//var holidayUrl = "https://timor.tech/api/holiday/info/" + date_value;
var holiday_url = "http://wow.kamisamak.com/api.php?date="+date_value
//月份
dateFormat.applyPattern("MM");
var month_number = dateFormat.format(newDate);
dateFormat.applyPattern("yyyy");
var year = dateFormat.format(newDate);
var year_month_number = year + "-" + month_number;
//季度
var quarter_name = "";
var quarter_number = "";
var year_quarter = "";
//按照我們的規則,否則默認是國外規則,星期日屬於下個周
switch (calendar.get(java.util.Calendar.MONTH) + 1) {
case 1:
case 2:
case 3:
quarter_name = "Q1";
quarter_number = "1";
year_quarter = year + "-" + quarter_name;
break;
case 4:
case 5:
case 6:
quarter_name = "Q2";
quarter_number = "2";
year_quarter = year + "-" + quarter_name;
break;
case 7:
case 8:
case 9:
quarter_name = "Q3";
quarter_number = "3";
year_quarter = year + "-" + quarter_name;
break;
case 10:
case 11:
case 12:
quarter_name = "Q4";
quarter_number = "4";
year_quarter = year + "-" + quarter_name;
break;
}
4、配置HttpClient組件
可以複製粘貼多個並行執行
5、配置JSON Input組件
6、配置 switch/case 組件
7、配置工作日、法定節假日、休息日等組件
8、配置字段選擇組件
保留需要的字段,刪除不需要的字段
9、配置parquet輸出
創建表,導入生成的數據
CREATE TABLE `date`(
`date_key` string,
`date_value` string,
`day_in_year` string,
`day_in_month` string,
`is_first_day_in_month` string,
`is_last_day_in_month` string,
`weekday` string,
`week_in_month` string,
`is_first_day_in_week` string,
`is_dayoff` string,
`is_workday` string,
`is_holiday` string,
`date_type` string,
`month_number` string,
`year` string,
`year_month_number` string,
`quarter_name` string,
`quarter_number` string,
`year_quarter` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat';
將kettle生成的數據移動到hdfs這個表的目錄下
修復表
msck repair table 表名
查詢測試
九、Kettle作業和參數
Job(作業)
- 如何傳送文件
- 驗證數據庫表是否存在,等等
Job Item(作業項)
作業項是作業的基本構成部分。如同轉換的組件,作業項也可以用圖標的方式展示。
- 作業順序執行作業項,必須定義一個起點
- 有一個「start」的作業項專門用來定義起點
- 一個作業只能定一個開始作業項
Job Hop(作業跳)
- 不論上一個作業項執行成功還是失敗,下一個作業項都會執行
- 藍色的連接線,上面有一個鎖的圖標
- 當上一個作業項的執行結果爲真時,執行下一個作業項
- 通常在需要無錯誤執行的情況下使用
- 綠色的連接線,上面有一個對鉤號的圖標。
- 當上一個作業項的執行結果爲假或者沒有成功執行時,執行下一個作業項
- 紅色的連接線,上面有一個紅色的停止圖標
- 在圖標上單擊就可以對Hop進行設置
22、Test22
參數
23、Test23-表輸入參數傳遞 - 轉換命名參數