离线数仓-数据增量采集与同步

方式1:

1、流水性数据: 写入数据库后不再发生变化的日志流水数据
每日可以按照数据时间进行增量采集,采集后放入数仓的ods

--query "select ... from ... where ... and updated_time>=T-1 and updated_time<T"

方式2:

2、普通性数据: 存在状态,内容变化的数据
数据量不大,可以每日全量快照采集
数据量比较大,每天变化大比例比较少,采用增量采集上日变化部分大数据
全量:

--query "select ... from ... where ... and updated_time<T"

update-全量:

--query "select ... from ... where ... and updated_time>=T-1 and updated_time<T"

方式3:

3、binlog实时采集
需要实时计算的场景
不需要实时计算,只是分散每日一次性采集压力
binlog实时采集,每天归集数据
采集后,只保留new部分的数据,采用json或者其它方式保存,为应对源端表结构的变化,采用json方便扩展,每条log数据
为一行记录,落地到hdfs上,无需关注binlog的顺序性。
数据归集: 获取本周期内,最后一次记录变更后的数据,作为本周期的数据快照。

select *
(
select *,
row_number() over (partition by id order by updated_time desc) as rn
from binlog_json) binlog
where rn = 1;

1)、实时同步写入hbase,与mysql源端一致的事务支持,然后周期性同步到数仓或者直接当作数仓ods层
2)、若数据量比较大,缩小归集接口,比如使用流式计算,每十分钟做一次数据归集,将结果写入log,每日再
对数据做一次整体归集,减少单次处理数据量
3)、数据量在可处理能力内,每日一次归集

示例

获取全量数据
A: T-2日全量数据
B: 昨日更新 + 昨日新增的数据 (stg 临时表用完之后就没用了 - 采用每天覆盖的方式)
(这里的 B 就是我们每天增量导入的 stg 的数据)

1、A和B都有的数据,取B
2、A没有,B有,取B
3、A有,B没有,取A
然后合并就可以得到全量数据, 即分区为 T-1 的数据
注: A(T-2) full join B on ID = ID

注: 即使数据库有删除的操作,数仓也不会进行删除的操作(目前大部分的业务系统都不再有删除数据的操作,通常
设计添加一个状态属性)

coalesce函数
语法: COALESCE(T v1, T v2, …)
返回参数中的第一个非空值;如果所有值都为NULL,那么返回NULL

采集例子:

stage.tmp_a

a partition(dt)

2020-05-10

–query “select … from … where updated_time=2020-05-10” --> stage.tmp_a

覆盖写入:
insert overwrite table a partition (dt = “2020-05-10”)
select
coalesce(tb.id,ta.id) as id,
coalesce(tb.name,ta.name) as name,



from
(select * from a where dt = ‘2020-05-09’) as ta full join stage_tmp_a as tb
on ta.id = tb.id;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雾岛与鲸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值