方式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;