ETL实践--kettle转到hive

本文介绍了一种将Kettle与Hive结合使用的优化方案,通过将数据关联操作从Kettle转移到Hive,提高了大数据场景下数据处理的效率。具体展示了如何改造SQL语句并创建Hive表及视图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

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'

 

转载于:https://www.cnblogs.com/double-kill/p/8283646.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值