• 【电商数仓】数仓搭建之原始数据(Operation Data Store -- ODS)层(用户行为数据、业务数据)


    ODS

    • 保持数据原貌不做任何修改,起到备份数据的作用。
    • 数据采用Gzip压缩,减少磁盘存储空间。
    • 创建分区表,防止后续的全表扫描,在企业开发中大量使用分区表。
    • 创建外部表。在企业开发中,除了自己用的临时表,创建内部表外,绝大多数场景都是创建外部表。

    27张业务数据表加1张用户行为数据表(log),共需要创建28张表,在mysql中有什么列,在这里就有什么列,直接复制过来。

    log中的json数据直接存放为一行,所有的JSON体都作为line的一部分。

    一 ODS层(用户行为数据)

    1 创建日志表ods_log

    在这里插入图片描述

    (1)创建分区表

    # 开启hive
    hive
    # 使用idea连接hive
    
    drop table if exists ods_log;
    CREATE EXTERNAL TABLE ods_log (`line` string)
    PARTITIONED BY (`dt` string) -- 按照时间创建分区
    LOCATION '/warehouse/gmall/ods/ods_log';  -- 指定数据在hdfs上的存储位置
    

    dt:每一天都需要采集数据,每一天采集的数据存储到对应的分区中,如2020-06-14采集到的数据dt字段就是2020-06-14

    (2)加载数据

    注意导入之后,原始数据就没了,从 /origin_data/gmall/log/topic_log 导入到 /warehousr/gmall/ods/ods_log

    load data inpath '/origin_data/gmall/log/topic_log/2020-06-14' into table ods_log partition(dt='2020-06-14');
    

    在idea中能够看到一行一行的日志信息,说明第一张表的导入没有问题。

    hadoop压缩中,能够自动识别压缩编码,不需要进行处理,这里采用得到是文本压缩格式,文本表格压缩,hadoop能够直接处理,但orc列存格式,就需要进行处理。

    注意:时间格式都配置成YYYY-MM-DD格式,这是Hive默认支持的时间格式

    2 Shell中单引号和双引号区别

    (1)在/home/hzy/bin创建一个test.sh文件

    vim test.sh
    # 在文件中添加如下内容
    #!/bin/bash
    do_date=$1
    
    echo '$do_date'
    echo "$do_date"
    echo "'$do_date'"
    echo '"$do_date"'
    echo `date`
    

    (2)查看执行结果

    test.sh 2020-06-14
    $do_date
    2020-06-14
    '2020-06-14'
    "$do_date"
    2020年 06月 18日 星期四 21:02:08 CST
    

    (3)总结

    • 单引号不取变量值
    • 双引号取变量值
    • 反引号`,执行引号中命令
    • 双引号内部嵌套单引号,取出变量值
    • 单引号内部嵌套双引号,不取出变量值

    3 ODS层日志表加载数据脚本

    (1)在/home/hzy/bin创建脚本

    vim hdfs_to_ods_log.sh
    # 在脚本中编写如下内容
    #!/bin/bash
    
    # 定义变量方便修改
    APP=gmall
    
    # 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天
    if [ -n "$1" ] ;then
       do_date=$1
    else 
       do_date=`date -d "-1 day" +%F`
    fi 
    
    echo ================== 日志日期为 $do_date ==================
    sql="
    load data inpath '/origin_data/$APP/log/topic_log/$do_date' into table ${APP}.ods_log partition(dt='$do_date');
    "
    
    hive -e "$sql"
    
    说明1
    [ -n 变量值 ] 判断变量的值,是否为空
    
    -- 变量的值,非空,返回true
    
    -- 变量的值,为空,返回false
    
    注意:[ -n 变量值 ]不会解析数据,使用[ -n 变量值 ]时,需要对变量加上双引号(" ")
    
    说明2
    查看date命令的使用,date --help
    

    (2)执行脚本

    hdfs_to_ods_log.sh 2020-06-14
    # 如果没有传参数,默认导入前一天的数据
    

    查看导入数据

    二 ODS层(业务数据)

    在这里插入图片描述

    1 27张表建表语句

    -- 活动信息表
    DROP TABLE IF EXISTS ods_activity_info;
    CREATE EXTERNAL TABLE ods_activity_info(
        `id` STRING COMMENT '编号',
        `activity_name` STRING  COMMENT '活动名称',
        `activity_type` STRING  COMMENT '活动类型',
        `start_time` STRING  COMMENT '开始时间',
        `end_time` STRING  COMMENT '结束时间',
        `create_time` STRING  COMMENT '创建时间'
    ) COMMENT '活动信息表'
    PARTITIONED BY (`dt` STRING)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    LOCATION '/warehouse/gmall/ods/ods_activity_info/';
    
    -- 活动规则表
    DROP TABLE IF EXISTS ods_activity_rule;
    CREATE EXTERNAL TABLE ods_activity_rule(
        `id` STRING COMMENT '编号',
        `activity_id` STRING  COMMENT '活动ID',
        `activity_type` STRING COMMENT '活动类型',
        `condition_amount` DECIMAL(16,2) COMMENT '满减金额',
        `condition_num` BIGINT COMMENT '满减件数',
        `benefit_amount` DECIMAL(16,2) COMMENT '优惠金额',
        `benefit_discount` DECIMAL(16,2) COMMENT '优惠折扣',
        `benefit_level` STRING COMMENT '优惠级别'
    ) COMMENT '活动规则表'
    PARTITIONED BY (`dt` STRING)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    LOCATION '/warehouse/gmall/ods/ods_activity_rule/';
    
    -- 一级品类表
    DROP TABLE IF EXISTS ods_base_category1;
    CREATE EXTERNAL TABLE ods_base_category1(
        `id` STRING COMMENT 'id',
        `name` STRING COMMENT '名称'
    ) COMMENT '商品一级分类表'
    PARTITIONED BY (`dt` STRING)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    LOCATION '/warehouse/gmall/ods/ods_base_category1/';
    
    -- 二级品类表
    DROP TABLE IF EXISTS ods_base_category2;
    CREATE EXTERNAL TABLE ods_base_category2(
        `id` STRING COMMENT ' id',
        `name` STRING COMMENT '名称',
        `category1_id` STRING COMMENT '一级品类id'
    ) COMMENT '商品二级分类表'
    PARTITIONED BY (`dt` STRING)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    LOCATION '/warehouse/gmall/ods/ods_base_category2/';
    -- 三级品类表
    DROP TABLE IF EXISTS ods_base_category3;
    CREATE EXTERNAL TABLE ods_base_category3(
        `id` STRING COMMENT ' id',
        `name` STRING COMMENT '名称',
        `category2_id` STRING COMMENT '二级品类id'
    ) COMMENT '商品三级分类表'
    PARTITIONED BY (`dt` STRING)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    LOCATION '/warehouse/gmall/ods/ods_base_category3/';
    
    -- 编码字典表
    DROP TABLE IF EXISTS ods_base_dic;
    CREATE EXTERNAL TABLE ods_base_dic(
        `dic_code` STRING COMMENT '编号',
        `dic_name` STRING COMMENT '编码名称',
        `parent_code` STRING COMMENT '父编码',
        `create_time` STRING COMMENT '创建日期',
        `operate_time` STRING COMMENT '操作日期'
    ) COMMENT '编码字典表'
    PARTITIONED BY (`dt` STRING)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    LOCATION '/warehouse/gmall/ods/ods_base_dic/';
    
    -- 省份表
    DROP TABLE IF EXISTS ods_base_province;
    CREATE EXTERNAL TABLE ods_base_province (
        `id` STRING COMMENT '编号',
        `name` STRING COMMENT '省份名称',
        `region_id` STRING COMMENT '地区ID',
        `area_code` STRING COMMENT '地区编码',
        `iso_code` STRING COMMENT 'ISO-3166编码,供可视化使用',
        `iso_3166_2` STRING COMMENT 'IOS-3166-2编码,供可视化使用'
    )  COMMENT '省份表'
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    LOCATION '/warehouse/gmall/ods/ods_base_province/';
    
    -- 地区表
    DROP TABLE IF EXISTS ods_base_region;
    CREATE EXTERNAL TABLE ods_base_region (
        `id` STRING COMMENT '编号',
        `region_name` STRING COMMENT '地区名称'
    )  COMMENT '地区表'
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    LOCATION '/warehouse/gmall/ods/ods_base_region/';
    
    -- 品牌表
    DROP TABLE IF EXISTS ods_base_trademark;
    CREATE EXTERNAL TABLE ods_base_trademark (
        `id` STRING COMMENT '编号',
        `tm_name` STRING COMMENT '品牌名称'
    )  COMMENT '品牌表'
    PARTITIONED BY (`dt` STRING)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    LOCATION '/warehouse/gmall/ods/ods_base_trademark/';
    
    -- 购物车表
    DROP TABLE IF EXISTS ods_cart_info;
    CREATE EXTERNAL TABLE ods_cart_info(
        `id` STRING COMMENT '编号',
        `user_id` STRING COMMENT '用户id',
        `sku_id` STRING COMMENT 'skuid',
        `cart_price` DECIMAL(16,2)  COMMENT '放入购物车时价格',
        `sku_num` BIGINT COMMENT '数量',
        `sku_name` STRING COMMENT 'sku名称 (冗余)',
        `create_time` STRING COMMENT '创建时间',
        `operate_time` STRING COMMENT '修改时间',
        `is_ordered` STRING COMMENT '是否已经下单',
        `order_time` STRING COMMENT '下单时间',
        `source_type` STRING COMMENT '来源类型',
        `source_id` STRING COMMENT '来源编号'
    ) COMMENT '加购表'
    PARTITIONED BY (`dt` STRING)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    LOCATION '/warehouse/gmall/ods/ods_cart_info/';
    
    -- 评论表
    DROP TABLE IF EXISTS ods_comment_info;
    CREATE EXTERNAL TABLE ods_comment_info(
        `id` STRING COMMENT '编号',
        `user_id` STRING COMMENT '用户ID',
        `sku_id` STRING COMMENT '商品sku',
        `spu_id` STRING COMMENT '商品spu',
        `order_id` STRING COMMENT '订单ID',
        `appraise` STRING COMMENT '评价',
        `create_time` STRING COMMENT '评价时间'
    ) COMMENT '商品评论表'
    PARTITIONED BY (`dt` STRING)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    LOCATION '/warehouse/gmall/ods/ods_comment_info/';
    
    -- 优惠券信息表
    DROP TABLE IF EXISTS ods_coupon_info;
    CREATE EXTERNAL TABLE ods_coupon_info(
        `id` STRING COMMENT '购物券编号',
        `coupon_name` STRING COMMENT '购物券名称',
        `coupon_type` STRING COMMENT '购物券类型 1 现金券 2 折扣券 3 满减券 4 满件打折券',
        `condition_amount` DECIMAL(16,2) COMMENT '满额数',
        `condition_num` BIGINT COMMENT '满件数',
        `activity_id` STRING COMMENT '活动编号',
        `benefit_amount` DECIMAL(16,2) COMMENT '减金额',
        `benefit_discount` DECIMAL(16,2) COMMENT '折扣',
        `create_time` STRING COMMENT '创建时间',
        `range_type` STRING COMMENT '范围类型 1、商品 2、品类 3、品牌',
        `limit_num` BIGINT COMMENT '最多领用次数',
        `taken_count` BIGINT COMMENT '已领用次数',
        `start_time` STRING COMMENT '开始领取时间',
        `end_time` STRING COMMENT '结束领取时间',
        `operate_time` STRING COMMENT '修改时间',
        `expire_time` STRING COMMENT '过期时间'
    ) COMMENT '优惠券表'
    PARTITIONED BY (`dt` STRING)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    LOCATION '/warehouse/gmall/ods/ods_coupon_info/';
    
    -- 优惠券领用表
    DROP TABLE IF EXISTS ods_coupon_use;
    CREATE EXTERNAL TABLE ods_coupon_use(
        `id` STRING COMMENT '编号',
        `coupon_id` STRING  COMMENT '优惠券ID',
        `user_id` STRING  COMMENT 'skuid',
        `order_id` STRING  COMMENT 'spuid',
        `coupon_status` STRING  COMMENT '优惠券状态',
        `get_time` STRING  COMMENT '领取时间',
        `using_time` STRING  COMMENT '使用时间(下单)',
        `used_time` STRING  COMMENT '使用时间(支付)',
        `expire_time` STRING COMMENT '过期时间'
    ) COMMENT '优惠券领用表'
    PARTITIONED BY (`dt` STRING)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    LOCATION '/warehouse/gmall/ods/ods_coupon_use/';
    
    -- 收藏表
    DROP TABLE IF EXISTS ods_favor_info;
    CREATE EXTERNAL TABLE ods_favor_info(
        `id` STRING COMMENT '编号',
        `user_id` STRING COMMENT '用户id',
        `sku_id` STRING COMMENT 'skuid',
        `spu_id` STRING COMMENT 'spuid',
        `is_cancel` STRING COMMENT '是否取消',
        `create_time` STRING COMMENT '收藏时间',
        `cancel_time` STRING COMMENT '取消时间'
    ) COMMENT '商品收藏表'
    PARTITIONED BY (`dt` STRING)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    LOCATION '/warehouse/gmall/ods/od
  • 相关阅读:
    如何实现一个K8S DevicePlugin?
    神经网络入门自学教程电子书,神经网络快速入门
    二次开发入门须知
    Flyway Desktop updated
    实时选品系统实现的难点
    Milvus 编译环境演进
    04 flink 集群搭建
    springboot aop Aspectj 切面
    apisix之插件开发,包含java和lua两种方式
    基于NIFI工具搭建生产级别的IIOT系统
  • 原文地址:https://blog.csdn.net/weixin_43923463/article/details/127078572