大数据电商数仓项目--实战(二)DWD层搭建

第一章 数仓搭建-DWD层

  1. 对用户行为数据解析
  2. 对业务数据采用维度模型重新装载

6.1 DWD层(用户行为日志)

在这里插入图片描述

6.1.1 日志格式回顾

  1. 页面埋点日志
    在这里插入图片描述
  2. 启动日志
    在这里插入图片描述

6.1.2 get_json_object函数使用

  1. 数据
    [{“name”:“大郎”,“sex”:“男”,“age”:“25”},{“name”:“西门庆”,“sex”:“男”,“age”:“47”}]
  2. 取出第一个json对象如下
    hive (gmall)>
    select get_json_object(‘[{“name”:“大郎”,“sex”:“男”,“age”:“25”},{“name”:“西门庆”,“sex”:“男”,“age”:“47”}]’,‘$[0]’);
    结果是:{“name”:“大郎”,“sex”:“男”,“age”:“25”}
  3. 取出第一个json的age字段的值
    hive (gmall)>
    SELECT get_json_object(‘[{“name”:“大郎”,“sex”:“男”,“age”:“25”},{“name”:“西门庆”,“sex”:“男”,“age”:“47”}]’,“$[0].age”);
    结果是:25

6.1.3 启动日志表

启动日志解析思路:启动日志表中每行数据对应一个启动记录,一个启动记录应该包含日志中的公共信息和启动信息。先将所有包含start字段的日志过滤出来,然后使用get_json_object函数解析每个字段。
1)建表语句

DROP TABLE IF EXISTS dwd_start_log;
CREATE EXTERNAL TABLE dwd_start_log(
    `area_code` STRING COMMENT '地区编码',
    `brand` STRING COMMENT '手机品牌',
    `channel` STRING COMMENT '渠道',
    `is_new` STRING COMMENT '是否首次启动',
    `model` STRING COMMENT '手机型号',
    `mid_id` STRING COMMENT '设备id',
    `os` STRING COMMENT '操作系统',
    `user_id` STRING COMMENT '会员id',
    `version_code` STRING COMMENT 'app版本号',
    `entry` STRING COMMENT 'icon手机图标 notice 通知 install 安装后启动',
    `loading_time` BIGINT COMMENT '启动加载时间',
    `open_ad_id` STRING COMMENT '广告页ID ',
    `open_ad_ms` BIGINT COMMENT '广告总共播放时间',
    `open_ad_skip_ms` BIGINT COMMENT '用户跳过广告时点',
    `ts` BIGINT COMMENT '时间'
) COMMENT '启动日志表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dwd/dwd_start_log'
TBLPROPERTIES ("orc.compress"="snappy");

2.)数据导入

insert overwrite table dwd_start_log partition(dt='2020-06-14')
select
    get_json_object(line,'$.common.ar'),
    get_json_object(line,'$.common.ba'),
    get_json_object(line,'$.common.ch'),
    get_json_object(line,'$.common.is_new'),
    get_json_object(line,'$.common.md'),
    get_json_object(line,'$.common.mid'),
    get_json_object(line,'$.common.os'),
    get_json_object(line,'$.common.uid'),
    get_json_object(line,'$.common.vc'),
    get_json_object(line,'$.start.entry'),
    get_json_object(line,'$.start.loading_time'),
    get_json_object(line,'$.start.open_ad_id'),
    get_json_object(line,'$.start.open_ad_ms'),
    get_json_object(line,'$.start.open_ad_skip_ms'),
    get_json_object(line,'$.ts')
from ods_log
where dt='2020-06-14'
and get_json_object(line,'$.start') is not null;

6.1.4 页面日志表

页面日志解析思路:页面日志表中每行数据对应一个页面访问记录,一个页面访问记录应该包含日志中的公共信息和页面信息。先将所有包含page字段的日志过滤出来,然后使用get_json_object函数解析每个字段。
1)建表语句

DROP TABLE IF EXISTS dwd_page_log;
CREATE EXTERNAL TABLE dwd_page_log(
    `area_code` STRING COMMENT '地区编码',
    `brand` STRING COMMENT '手机品牌',
    `channel` STRING COMMENT '渠道',
    `is_new` STRING COMMENT '是否首次启动',
    `model` STRING COMMENT '手机型号',
    `mid_id` STRING COMMENT '设备id',
    `os` STRING COMMENT '操作系统',
    `user_id` STRING COMMENT '会员id',
    `version_code` STRING COMMENT 'app版本号',
    `during_time` BIGINT COMMENT '持续时间毫秒',
    `page_item` STRING COMMENT '目标id ',
    `page_item_type` STRING COMMENT '目标类型',
    `last_page_id` STRING COMMENT '上页类型',
    `page_id` STRING COMMENT '页面ID ',
    `source_type` STRING COMMENT '来源类型',
    `ts` bigint
) COMMENT '页面日志表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dwd/dwd_page_log'
TBLPROPERTIES ("orc.compress"="snappy");

2)数据导入

insert overwrite table dwd_page_log partition(dt='2020-06-14')
select
    get_json_object(line,'$.common.ar'),
    get_json_object(line,'$.common.ba'),
    get_json_object(line,'$.common.ch'),
    get_json_object(line,'$.common.is_new'),
    get_json_object(line,'$.common.md'),
    get_json_object(line,'$.common.mid'),
    get_json_object(line,'$.common.os'),
    get_json_object(line,'$.common.uid'),
    get_json_object(line,'$.common.vc'),
    get_json_object(line,'$.page.during_time'),
    get_json_object(line,'$.page.item'),
    get_json_object(line,'$.page.item_type'),
    get_json_object(line,'$.page.last_page_id'),
    get_json_object(line,'$.page.page_id'),
    get_json_object(line,'$.page.source_type'),
    get_json_object(line,'$.ts')
from ods_log
where dt='2020-06-14'
and get_json_object(line,'$.page') is not null;

6.1.5 动作日志表

动作日志解析思路:动作日志表中每行数据对应用户的一个动作记录,一个动作记录应当包含公共信息、页面信息以及动作信息。先将包含action字段的日志过滤出来,然后通过UDTF函数,将action数组“炸开”(类似于explode函数的效果),然后使用get_json_object函数解析每个字段。
在这里插入图片描述
1)建表语句

DROP TABLE IF EXISTS dwd_action_log;
CREATE EXTERNAL TABLE dwd_action_log(
    `area_code` STRING COMMENT '地区编码',
    `brand` STRING COMMENT '手机品牌',
    `channel` STRING COMMENT '渠道',
    `is_new` STRING COMMENT '是否首次启动',
    `model` STRING COMMENT '手机型号',
    `mid_id` STRING COMMENT '设备id',
    `os` STRING COMMENT '操作系统',
    `user_id` STRING COMMENT '会员id',
    `version_code` STRING COMMENT 'app版本号',
    `during_time` BIGINT COMMENT '持续时间毫秒',
    `page_item` STRING COMMENT '目标id ',
    `page_item_type` STRING COMMENT '目标类型',
    `last_page_id` STRING COMMENT '上页类型',
    `page_id` STRING COMMENT '页面id ',
    `source_type` STRING COMMENT '来源类型',
    `action_id` STRING COMMENT '动作id',
    `item` STRING COMMENT '目标id ',
    `item_type` STRING COMMENT '目标类型',
    `ts` BIGINT COMMENT '时间'
) COMMENT '动作日志表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dwd/dwd_action_log'
TBLPROPERTIES ("orc.compress"="snappy");
  1. 创建UDTF函数
    主要是为了将传入的整个行为字符串,转化为一个一个的行为json 传出来进行处理
    在这里插入图片描述
    (1)创建一个maven工程:hivefunction
    (2)创建包名:com.atguigu.hive.udtf
    (3)引入如下依赖
<dependencies>
    <!--添加hive依赖-->
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-exec</artifactId>
        <version>3.1.2</version>
    </dependency>
</dependencies>

(4)编码

package com.atguigu.hive.udtf;

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.json.JSONArray;

import java.util.ArrayList;
import java.util.List;

public class ExplodeJSONArray extends GenericUDTF {
   
   

    @Override
    public StructObjectInspector initialize(ObjectInspector[] argOIs) throws UDFArgumentException {
   
   

        // 1 参数合法性检查
        if (argOIs.length != 1) {
   
   
            throw new UDFArgumentException("explode_json_array 只需要一个参数");
        }
大数据商数项目中,合理的命名规范和项目结构对于后期维护、协作开发以及系统扩展至关重要。以下是一些关于大数据商平台数项目的命名建议: ### 1. 数据库与表名命名 - **数据库命名**:使用简洁且具有业务含义的英文缩写,如 `gmall` 表示“谷商城”,`ecommerce_dw` 表示“商数库”。 - **表名命名**: - 使用小写字母,避免大小写混合。 - 用下划线 `_` 分隔单词,如 `ads_sale_tm_category1_stat_mn`。 - 前缀表示级,如 `dwd_dim_coupon_info` 中 `dwd` 表示明细,`dim` 表示维度表[^3]。 - 后缀可包含时间周期信息,例如 `stat_mn` 表示按月统计[^2]。 ### 2. 级前缀命名建议 不同数据处理阶段应有明确的级划分,常见级如下: - **ODS(Operational Data Store)**:原始操作数据,保留原始数据格式。 - **DWD(Data Warehouse Detail)**:数据清洗后的明细,用于存储标准化后的数据。 - **DWS(Data Warehouse Summary)**:汇总,对 DWD 的数据进行聚合。 - **ADS(Application Data Store)**:应用,为报表或分析提供最终结果数据[^2]。 ### 3. 字段命名规范 - **字段命名**: - 字段名应清晰表达其含义,如 `buycount` 表示购买人数,`category1_id` 表示一级品类 ID[^2]。 - 对于常见的业务术语,可采用统一缩写,如 `tm_id` 表示品牌 ID,`spu_id` 表示商品 ID[^3]。 - **时间字段**: - 统一使用 `create_time`、`operate_time`、`expire_time` 等格式,便于识别与处理。 ### 4. 项目目录结构命名 - **HDFS 路径命名**: - 按照业务模块和数据级组织路径,如 `/warehouse/gmall/ads/ads_sale_tm_category1_stat_mn/`[^2]。 - 使用 `dt=YYYY-MM-DD` 格式作为分区路径,便于按日期查询与管理。 ### 5. 技术组件命名建议 - **UDF 函数命名**: - 自定义函数类名应体现功能,如 `org.apache.hadoop.hive.ql.exec.UDF` 是 Hive 的 UDF 基类,开发者可根据功能命名具体类,如 `CalculateRebuyRate`[^1]。 - **包结构命名**: - 使用反向域名风格,如 `com.example.ecommerce.dwd` 表示“example.com”公司的商明细代码[^1]。 ### 示例命名 #### 表命名示例 ```sql -- 明细优惠券维度表 CREATE EXTERNAL TABLE dwd_dim_coupon_info( id STRING COMMENT '购物券编号', coupon_name STRING COMMENT '购物券名称' ) PARTITIONED BY (dt STRING) ``` #### 应用表命名示例 ```sql -- 应用品牌复购率统计表 CREATE EXTERNAL TABLE ads_sale_tm_category1_stat_mn ( tm_id STRING COMMENT '品牌id', category1_id STRING COMMENT '1级品类id', buy_twice_last_ratio DECIMAL(10,2) COMMENT '单次复购率' ) ``` #### HDFS 路径示例 ``` /warehouse/gmall/dwd/dwd_dim_coupon_info/ /warehouse/gmall/ads/ads_sale_tm_category1_stat_mn/ ``` #### Java 包结构示例 ```java import com.example.ecommerce.utils.StringUtils; import com.example.ecommerce.udf.CalculateRebuyRate; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月初,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值