数据采集规范
ods层经常遇到 增全量合并的情况
即dt = t+2 为全量数据
t+1 为增量数据
insert overwrite table tb_test partition(ds='${bizdate}')
select case when a.id is not null then a.id esle b.id end as id
,if(a.name is not null, a.name, b.name) as name
,coalesce(a.age, b.age) as age
--这3种写法一样,都是优先取delta表的字段
select * from tb_test_delta where ds=T-1
full outer join(union all)
select * from tb_test where ds=T-2
on a.id =b.id;
存储策略方面:
存储有全量,增量 增全量
增量 按日增量(仅新增 ,新增及更新)
全量 没有分区字段,直接全量抽取 overwrite 到目标表
增全量(使用最多) 在x行项目中,p层的增全量保留策略是
1.首先 建表为 日分区表,每日保留该月 月初到今天的数据
每月末保留月初到月末的所有数据
月初删除上个月一号到月末前一天 (列入数据到10月1号,删除9.1 到 9.29的日期分区的数据)
2.每日保留近两年的数据
- 有些日期内的数据量不是很多,单独采用一个分区存储的话,会造成很多小文件
使用增全量,会尽量避免这一情况发生
- 每个日期分区data_dt 为月末时,会保留该月所有数据 然后删除到1-29号的数据
这样 即使在查询的时候 只要查询每个月末的日期分区,也是全部日期的数据量
sql规范
1.不允许数据中含有null值
不能使用null ,只能使用'' 代替null存储, 使用 coalese() 函数进行转换
如果where 子句中含有对null值的字段进行操作,会导致二叉树失效从而进行全表扫描
2.尽量避免!= <>
非字符的使用,会导致全表扫描
3 in 和not in 慎用
使用 exists 代替in, 如果是连续数值,可以使用between and
4 尽量避免like %abc%的操作,可以使用 like '%abc' 代替 left()
可以用截取字段进行比较的,不要使用'%like%',like 不仅会全表扫描,还会全字段扫描
5 尽量避免在where子句对字段进行函数/表达式操作
如使用,impala 会对该列所有字段进行函数操作比较
6 尽量使用数值类型字段
7 尽可能使用varchar 代替char
8尽量避免 DISTINCT 的操作
distinct 会导致全表比对 去重可以使用 group by 或者 row_number()去重
9 不要使用 insert+values 插入数据