impala优化及规范(自用)

数据采集规范

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 插入数据