表的分类
实体表:一般是指一个现实存在的业务对象,比如用户,商品,商家,销售员等等。
维度表:一般是指对应一些业务状态,编号的解释表。也可以称之为码表。比如地区表,订单状态,支付方式,审批状态,商品分类等等。
事务型事实表:一般指随着业务发生不断产生的数据。特点是一旦发生不会再变化。一般比如,交易流水,操作日志,出库入库记录等等。
周期型事实表,一般指随着业务发生不断产生的数据。与事务型不同的是,数据会随着业务周期性的推进而变化。比如订单,其中订单状态会周期性变化。再比如,请假、贷款申请,随着批复状态在周期性变化。
同步策略
实体表同步策略:实体表数据量比较小,通常可以做每日全量,就是每天存一份完整数据,即每日全量。
维度表同步策略:维度表数据量比较小,通常可以做每日全量,就是每天存一份完整数据,即每日全量。
事务型事实表同步策略:因为数据不会变化,而且数据量巨大,所以每天只同步新增数据即可,所以可以做成每日增量表,即每日创建一个分区存储。
周期型事实表同步策略:这类表从数据量的角度,存每日全量的话,数据量太大,冗余也太大;如果用每日增量的话无法反应数据变化;每日新增及变化量,包括了当日的新增和修改。一般来说这个表,足够计算大部分当日数据的。但是这种依然无法解决能够得到某一个历史时间点(时间切片)的切片数据。 所以要用利用每日新增和变化表,制作一张拉链表,以方便的取到某个时间切片的快照数据。所以我们需要得到每日新增及变化量。
业务数仓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 " " --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