表的分類
實體表:一般是指一個現實存在的業務對象,比如用戶,商品,商家,銷售員等等。
維度表:一般是指對應一些業務狀態,編號的解釋表。也可以稱之為碼表。比如地區表,訂單狀態,支付方式,審批狀態,商品分類等等。
事務型事實表:一般指隨着業務發生不斷產生的數據。特點是一旦發生不會再變化。一般比如,交易流水,操作日志,出庫入庫記錄等等。
周期型事實表,一般指隨着業務發生不斷產生的數據。與事務型不同的是,數據會隨着業務周期性的推進而變化。比如訂單,其中訂單狀態會周期性變化。再比如,請假、貸款申請,隨着批復狀態在周期性變化。
同步策略
實體表同步策略:實體表數據量比較小,通常可以做每日全量,就是每天存一份完整數據,即每日全量。
維度表同步策略:維度表數據量比較小,通常可以做每日全量,就是每天存一份完整數據,即每日全量。
事務型事實表同步策略:因為數據不會變化,而且數據量巨大,所以每天只同步新增數據即可,所以可以做成每日增量表,即每日創建一個分區存儲。
周期型事實表同步策略:這類表從數據量的角度,存每日全量的話,數據量太大,冗余也太大;如果用每日增量的話無法反應數據變化;每日新增及變化量,包括了當日的新增和修改。一般來說這個表,足夠計算大部分當日數據的。但是這種依然無法解決能夠得到某一個歷史時間點(時間切片)的切片數據。 所以要用利用每日新增和變化表,制作一張拉鏈表,以方便的取到某個時間切片的快照數據。所以我們需要得到每日新增及變化量。
業務數倉8張表導入示例
導入腳本:
①此腳本將數據從MySql導入到HDFS。
②對於商品表、用戶表和一級、二級、三級分類表,都采用全量導入的方式,反應在導入的sql上,就是where 1=1。
③對於訂單詳情和支付流水表,采用增量導入的方式,反應在sql上,就是where DATE_FORMAT(payment_time,'%Y-%m-%d')='$db_date',只導當前天的。
④對於訂單表,采用導入新增和變化的數據反應在sql上,就是DATE_FORMAT(create_time,'%Y-%m-%d')='$db_date' or DATE_FORMAT(operate_time,'%Y-%m-%d')='$db_date',既導今天新增的,又導最后操作時間為今天的(變化的)。
#!/bin/bash db_date=$2 echo $db_date db_name=gmall import_data() { /opt/module/sqoop/bin/sqoop import \ --connect jdbc:mysql://hadoop102:3306/$db_name \ --username root \ --password 000000 \ --target-dir /origin_data/$db_name/db/$1/$db_date \ --delete-target-dir \ --num-mappers 1 \ --fields-terminated-by "\t" \ --query "$2"' and $CONDITIONS;' } import_sku_info(){ import_data "sku_info" "select id, spu_id, price, sku_name, sku_desc, weight, tm_id, category3_id, create_time from sku_info where 1=1" } import_user_info(){ import_data "user_info" "select id, name, birthday, gender, email, user_level, create_time from user_info where 1=1" } import_base_category1(){ import_data "base_category1" "select id, name from base_category1 where 1=1" } import_base_category2(){ import_data "base_category2" "select id, name, category1_id from base_category2 where 1=1" } import_base_category3(){ import_data "base_category3" "select id, name, category2_id from base_category3 where 1=1" } import_order_detail(){ import_data "order_detail" "select od.id, order_id, user_id, sku_id, sku_name, order_price, sku_num, o.create_time from order_info o, order_detail od where o.id=od.order_id and DATE_FORMAT(create_time,'%Y-%m-%d')='$db_date'" } import_payment_info(){ import_data "payment_info" "select id, out_trade_no, order_id, user_id, alipay_trade_no, total_amount, subject, payment_type, payment_time from payment_info where DATE_FORMAT(payment_time,'%Y-%m-%d')='$db_date'" } import_order_info(){ import_data "order_info" "select id, total_amount, order_status, user_id, payment_way, out_trade_no, create_time, operate_time from order_info where (DATE_FORMAT(create_time,'%Y-%m-%d')='$db_date' or DATE_FORMAT(operate_time,'%Y-%m-%d')='$db_date')" } case $1 in "base_category1") import_base_category1 ;; "base_category2") import_base_category2 ;; "base_category3") import_base_category3 ;; "order_info") import_order_info ;; "order_detail") import_order_detail ;; "sku_info") import_sku_info ;; "user_info") import_user_info ;; "payment_info") import_payment_info ;; "all") import_base_category1 import_base_category2 import_base_category3 import_order_info import_order_detail import_sku_info import_user_info import_payment_info ;; esac