zoukankan      html  css  js  c++  java
  • 数据仓库 表的分类与同步策略

    表的分类

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

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

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

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

    同步策略

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

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

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

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

    业务数仓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
  • 相关阅读:
    測试能否发表博客
    换站点Logo图片---轻开电子商务系统(企业入门级B2C站点)
    后台运行命令:&和nohup command & 以及关闭、查看后台任务
    HttpClient将手机上的数据发送到服务器
    支付宝电脑网站支付
    远程使用tomcat8的首页的管理工具
    数据结构之链表基本操作
    数据结构之链表反向打印
    ultraedit开发使用技巧
    charles抓取https中出现unknow
  • 原文地址:https://www.cnblogs.com/noyouth/p/13209570.html
Copyright © 2011-2022 走看看