前言
由於筆者很榮幸的參與了目前所在公司的登月計划,整個登月計划過程中收獲也頗豐,在此之前,完全沒有和數據打交道的經驗,所以一些基本問題需要總結出來,以供自己日后參考;
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;