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/1000) id,
- count(*),max(id),min(id)
- FROM test.table
- where etl_tx_dt=20190227
- group by floor(id/1000)
来源: http://www.bubuko.com/infodetail-2972999.html