数据仓库 表的分类与同步策略

表的分类

实体表:一般是指一个现实存在的业务对象,比如用户,商品,商家,销售员等等。

维度表:一般是指对应一些业务状态,编号的解释表。也可以称之为码表。比如地区表,订单状态,支付方式,审批状态,商品分类等等。

事务型事实表:一般指随着业务发生不断产生的数据。特点是一旦发生不会再变化。一般比如,交易流水,操作日志,出库入库记录等等。

周期型事实表,一般指随着业务发生不断产生的数据。与事务型不同的是,数据会随着业务周期性的推进而变化。比如订单,其中订单状态会周期性变化。再比如,请假、贷款申请,随着批复状态在周期性变化。

同步策略

实体表同步策略:实体表数据量比较小,通常可以做每日全量,就是每天存一份完整数据,即每日全量

维度表同步策略:维度表数据量比较小,通常可以做每日全量,就是每天存一份完整数据,即每日全量

事务型事实表同步策略:因为数据不会变化,而且数据量巨大,所以每天只同步新增数据即可,所以可以做成每日增量表,即每日创建一个分区存储

周期型事实表同步策略:这类表从数据量的角度,存每日全量的话,数据量太大,冗余也太大;如果用每日增量的话无法反应数据变化;每日新增及变化量,包括了当日的新增和修改。一般来说这个表,足够计算大部分当日数据的。但是这种依然无法解决能够得到某一个历史时间点(时间切片)的切片数据。 所以要用利用每日新增和变化表,制作一张拉链表,以方便的取到某个时间切片的快照数据。所以我们需要得到每日新增及变化量。

业务数仓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
原文地址:https://www.cnblogs.com/noyouth/p/13209570.html