zoukankan      html  css  js  c++  java
  • ETL工程师知识点

    前言

    由于笔者很荣幸的参与了目前所在公司的登月计划,整个登月计划过程中收获也颇丰,在此之前,完全没有和数据打交道的经验,所以一些基本问题需要总结出来,以供自己日后参考;
    1、作为一名开发人员,我们不仅要懂得技术的实现要点,也需要懂得自己所处工作组的业务逻辑;
    2、作为处理数据的工程师,不仅要懂得写基本的SQL,还需要懂得怎么去用日常的许多基本工具;
    3、作为数据开发和同步人员,我们往往有必要懂得如何分析基本的数据;

    正文

    1、同步数据的过程中,有sa层数据、sda层数据、rda层数据,那么这三种数据层的差异在哪里?
    首先,简单说明一下数据来源,sa层的数据来源于sqoop直接抽取mysql数据库的数据,属于一个全量的非实时的数据;
    sda层数据则是结合了sa层数据+binlog操作日志,组合成为了一个全量的t-1的实时数据;
    binlog数据来源,通过阿里的开源框架canal,模仿mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议,从而收集binary log给slave,得到binlog的字节流日志;
    目前同步方式为binlog->Kafka->Spark Streaming->hdfs->Impala刷新;
    rda层数据=sda的t-1数据+binlog的t数据,组合成为一个全量的实时数据,保证业务方使用到的数据都是实时的;
    2、为什么会有这么多层数据产生,sda层相对于sa层解决了什么,rda层相对于sda层的优点又在哪里?
    (1)sda层数据的出现,主要是因为通过sqoop抽取的sa数据,可能会因为sqoop进程启动的时候晚了10分钟,导致最终sa的数据,可能是t-2的数据加上多余10分钟的数据;
    为了解决这多处10分钟的数据问题,我们加上binlog的t-1的数据,由于binlog只取最新的数据,所以即使sa有多余10分钟的数据,也最终会被binlog最新的数据给替换,所以组成全新的完整的没有多余数据的t-1数据;
    (2)rda层相对于sda层数据的优点在于它是一个实时(t)的数据,同样用sda层数据+binlog数据,是为了避免多余10分钟数据的情况出现,由sda+binlog的数据,又能保证数据是实时的数据;
    3、hue平台的使用总结,我们在很多时候会通过hue添加一些大数据组件,其中就有hive和impala,那么两者的区别和各自优势?
    在底层表结构和数据变更的时候,hive的实时响应比impala要快很多,所以如果刚刚同步完一张表,如果没有进行refresh或者INVALIDATE METADATA的话,那么hive可能很快能查得到这张表的表结构和同步数据,而impala需要几分钟以后才能开始使用这张表;
    impala的查数速度快于hive,这是因为hive的底层查数使用缓慢的MapReduce批处理,而impala直接从HDFS或HBase中用SELECT、JOIN和统计函数查询数据,大大降低了延迟;
    4、表结构变更和表数据刷新:refresh table、INVALIDATE METADATA;
    5、在删除表的时候出现外健级联的时候,无法drop table之后:
    SET foreign_key_checks = 0; // 先设置外键约束检查关闭
    drop table table1; // 删除表,如果要删除视图,也是如此
    SET foreign_key_checks = 1; // 开启外键约束检查,以保持表结构完整性
    6、union all的用法:
    select count(*) from test.table where etl_tx_dt=20181226 union all
    select count(*) from test.table1 where etl_tx_dt=20181226 union all
    select count(*) from test.table2 where etl_tx_dt=20181226 union all
    .......
    7、删除表分区、显示表所有分区:
    alter table test.table drop partition (etl_tx_dt='2019-02-27');
    show partitions test.table1;
    8、sql验数的经验分析:
    (1)计算字段的时候,int、bigint、decimal类型的字段用sum,string、timestamp类型的用count;
    (2)当某张表出现数据条数不对的时候,首先要检查基础表数据条数对不对;
    (3)当总条数对上,字段条数对上以后,需要去底层分析哪一个字段出现不对,有可能是因为不同的平台,同步数据的方式不同,假设a平台的数据默认null和''为空,都计算为一个字段,而b平台同步完以后,只计算null的条数,而不计算''的条数,这就会导致某一个字段同步完以后,条数对应不上;
    解决办法:case when xxx='' then null end as xxx ;
    (4)当null也对的上的时候,就需要去定位id,逐步缩小数据失误的范围,最终找到某条id的数据,如:

    按照截断分区查数据:
    select floor(id/10000) sa_id,
    count(*),min(id),max(id)
    from test.table
    where etl_tx_dt=20190314
    GROUP BY floor(id/10000)
    order by sa_id
    desc
    
    select floor(id/10000) sda_id,
    count(*),min(id),max(id)
    from test.table
    where etl_tx_dt=20190314
    GROUP BY floor(id/10000)
    order by sda_id
    desc
    用excel比较出两者的id区别在哪里,然后比较找出相差的区间id;
    
    查找相差区间的最大id和最小id,查最大数和最小数据两条数据: 
    select * from test.table 
    where etl_tx_dt=20190314 
    and id in(26510000,26517670) 
    
    查找相差区间的最大id和最小id,查区间数据: 
    select * from test.table 
    where etl_tx_dt=20190314 
    and id>=26510000 and id <=26517670
    

    9、较验数据时候,核对字段的统计策略:

    (1)数值类型的都用sum,如:int、bigint、decimal(38,4);

    (2)非数值类型的用count,如:string;

    参考资料

  • 相关阅读:
    PL/SQL快捷键
    <c:if>条件判断 和 取值做乘法运算
    文档保存后找不到了误以为丢失,重做!
    Gson将参数放入实体类中进行包装之后再传递
    [leedcode 66] Plus One
    [leedcode 65] Valid Number
    [leedcode 64] Minimum Path Sum
    [leedcode 63] Unique Paths II
    [leedcode 62] Unique Paths
    [leedcode 61] Rotate List
  • 原文地址:https://www.cnblogs.com/haoxinchen/p/10459432.html
Copyright © 2011-2022 走看看