ETL實踐--kettle轉到hive


 

 

ETL實踐--kettle只做源數據的抽取,其他數據轉換轉到hive上。

 

 

 

1、用hive代替kettle的數據關聯的原因

(1)、公司之前的數據ELT大量使用了kettle。用kettle導原始數據速度還是蠻快的,但是如果是大表關聯類的操作,效率就很差。

一方面是由於hive是用數據庫來做關聯,數據庫的性能跟不上;另外一個方面也是數據要從數據庫抽取到kettle,處理完之后還要寫回數據庫,走了2此網絡。

(2)、公司目前非實時的大數據查詢主要是再kylin上,kylin的數據源就是hive,所以我們現在就有用到hive。拿到的數據最后還是要導入到hive上給kylin用。

(3)、hive底層是mr,對大數據的關聯比數據庫性能要高很多。同時hive的hql也是類似sql的。hql實現不了的,還可以通過UDF來實現(java代碼大家總是可以搞定的)。

 

 


2、下面演示一個我從kettle遷移到hive的數據關聯

(1)、sql大致的需求

把數據發生的時間提前6個小時,然后按照這個新的時間所在的天和學號一起分組,按照這個新的(提前6個小時的)時間排序取第一條記錄。

后面還有一些其他的條件:比如增量更新的時間判斷,還有新的 時間要小於 '17:30:00'這個點。

 

 

 

(2)、原始kettle任務(的sql)

SELECT
b.TermID,b.OutId,b.OpDT,b.subsixhour,concat(b.subsixhour,b.OutId) as temp
FROM
(

SELECT
a.*
FROM
(SELECT
id
, TermID
, OutId
, OpDT
, ioflag
,date_sub(OpDT,interval 6 HOUR) as subopdt
,DATE_FORMAT(date_sub(OpDT,interval 6 HOUR),"%Y-%m-%d") as subsixhour
FROM access_record
where OpDT >? and OpDT <=? and OutId is not null
ORDER BY subopdt desc) a
GROUP BY a.subsixhour,a.OutId

)b
WHERE b.ioflag = 1 AND DATE_FORMAT(b.subopdt,"%H:%i:%S") < '17:30:00'

 

 

 

(3)、改造后的kettle任務的sql(只抽取原始數據)

SELECT
b.*,date_sub(b.OpDT,interval 6 HOUR) as subopdt,DATE_FORMAT(date_sub(b.OpDT,interval 6 HOUR),"%Y-%m-%d") as subsixhour
FROM access_record b
where b.OpDT >? and b.OpDT <=? and b.OutId is not null

特別說明

這里date_sub(b.OpDT,interval 6 HOUR) as subopdt這個格式化字段的操作,再hive里面沒有找到對應的函數。

本來是准備通過寫一個UDF來解決的,結果沒有調通,所以格式化字段這個操作暫時還放在了kettle里面。

 

 

 

 

(4)、建立hive表(上一步導入的數據就再這個表里)

create external table access_record
(id int,
TermID int,
ExtendTermID int,
CustomerID int,
CardNo int,
OutId string,
CardSNR string,
OpDT TIMESTAMP,
CollDT TIMESTAMP,
RecType int,
AccCode int,
HZ int,
RecNo int,
FrameNo int,
IsUpload int,
CollectType int,
CardType int,
ioflag int,
CardSNR16 string,
name string,
cellphoneno string,
subopdt TIMESTAMP,
subsixhour date)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE location '/jkd/access_record1';

 

 

 

(6)、新建hive視圖,用於數據關聯(建視圖是為了kylin可以直接查詢這個視圖,及時獲取到關聯好的數據)

CREATE or replace VIEW view_access_record_out AS
SELECT
a.TermID,a.OutId,a.OpDT,a.subsixhour,concat(a.subsixhour,a.OutId) as temp
FROM
(SELECT
id
, TermID
, OutId
, OpDT
, ioflag
,subopdt
,subsixhour,
row_number() over (partition by subsixhour,OutId order by subopdt desc) rowNum
FROM access_record
) a
where a.rowNum=1 and a.ioflag = 1 AND DATE_FORMAT(a.subopdt,"HH:mm:ss") < '17:30:00'

 


免責聲明!

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



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