数仓搭建-DIM层

1 商品维度表(全量)

建表语句

DROP TABLE IF EXISTS dim_sku_info;
CREATE EXTERNAL TABLE dim_sku_info (
    `id` STRING COMMENT '商品id',
    `price` DECIMAL(16,2) COMMENT '商品价格',
    `sku_name` STRING COMMENT '商品名称',
    `sku_desc` STRING COMMENT '商品描述',
    `weight` DECIMAL(16,2) COMMENT '重量',
    `is_sale` BOOLEAN COMMENT '是否在售',
    `spu_id` STRING COMMENT 'spu编号',
    `spu_name` STRING COMMENT 'spu名称',
    `category3_id` STRING COMMENT '三级分类id',
    `category3_name` STRING COMMENT '三级分类名称',
    `category2_id` STRING COMMENT '二级分类id',
    `category2_name` STRING COMMENT '二级分类名称',
    `category1_id` STRING COMMENT '一级分类id',
    `category1_name` STRING COMMENT '一级分类名称',
    `tm_id` STRING COMMENT '品牌id',
    `tm_name` STRING COMMENT '品牌名称',
    `sku_attr_values` ARRAY<STRUCT<attr_id:STRING,value_id:STRING,attr_name:STRING,value_name:STRING>> COMMENT '平台属性',
    `sku_sale_attr_values` ARRAY<STRUCT<sale_attr_id:STRING,sale_attr_value_id:STRING,sale_attr_name:STRING,sale_attr_value_name:STRING>> COMMENT '销售属性',
    `create_time` STRING COMMENT '创建时间'
) COMMENT '商品维度表'
PARTITIONED BY (`dt` STRING)
STORED AS PARQUET
LOCATION '/warehouse/gmall/dim/dim_sku_info/'
TBLPROPERTIES ("parquet.compression"="lzo");

 数据装载思路

 

 装载语句:

首日装载

with
sku as
(
    select
        id,
        price,
        sku_name,
        sku_desc,
        weight,
        is_sale,
        spu_id,
        category3_id,
        tm_id,
        create_time
    from ods_sku_info
    where dt='2020-06-14'
),
spu as
(
    select
        id,
        spu_name
    from ods_spu_info
    where dt='2020-06-14'
),
c3 as
(
    select
        id,
        name,
        category2_id
    from ods_base_category3
    where dt='2020-06-14'
),
c2 as
(
    select
        id,
        name,
        category1_id
    from ods_base_category2
    where dt='2020-06-14'
),
c1 as
(
    select
        id,
        name
    from ods_base_category1
    where dt='2020-06-14'
),
tm as
(
    select
        id,
        tm_name
    from ods_base_trademark
    where dt='2020-06-14'
),
attr as
(
    select
        sku_id,
        collect_set(named_struct('attr_id',attr_id,'value_id',value_id,'attr_name',attr_name,'value_name',value_name)) attrs
    from ods_sku_attr_value
    where dt='2020-06-14'
    group by sku_id
),
sale_attr as
(
    select
        sku_id,
        collect_set(named_struct('sale_attr_id',sale_attr_id,'sale_attr_value_id',sale_attr_value_id,'sale_attr_name',sale_attr_name,'sale_attr_value_name',sale_attr_value_name)) sale_attrs
    from ods_sku_sale_attr_value
    where dt='2020-06-14'
    group by sku_id
)
insert overwrite table dim_sku_info partition(dt='2020-06-14')
select
    sku.id,
    sku.price,
    sku.sku_name,
    sku.sku_desc,
    sku.weight,
    sku.is_sale,
    sku.spu_id,
    spu.spu_name,
    sku.category3_id,
    c3.name,
    c3.category2_id,
    c2.name,
    c2.category1_id,
    c1.name,
    sku.tm_id,
    tm.tm_name,
    attr.attrs,
    sale_attr.sale_attrs,
    sku.create_time
from sku
left join spu on sku.spu_id=spu.id
left join c3 on sku.category3_id=c3.id
left join c2 on c3.category2_id=c2.id
left join c1 on c2.category1_id=c1.id
left join tm on sku.tm_id=tm.id
left join attr on sku.id=attr.sku_id
left join sale_attr on sku.id=sale_attr.sku_id;

先创建商品维度表,再执行装载语句:

 查看商品维度表中的结果

 出现异常的原因:会先将索引文件当成小文件合并,将其当做普通文件处理。更严重的是,这会导致LZO文件无法切片。

 解决索引文件被误合并的问题:(关闭hive的mat端的小文件合并)

解决办法:修改CombineHiveInputFormatHiveInputFormat

hive (gmall)>

set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;

 再来执行一下装载语句

(insert overwrite会把原来的数据覆盖掉,所以可以多次执行装载语句)

 2 优惠券维度表(全量)

建表语句

DROP TABLE IF EXISTS dim_coupon_info;
CREATE EXTERNAL TABLE dim_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 '
<think>嗯,用户现在问的是如何从0到1搭建。首先,我需要回想之前用户问的问题,他们之前询问过需求调研和据整理的工作流程,现在可能是在同一个项目中的后续步骤。用户可能是一位刚入行的大据工程师,或者是一个需要构建数据仓库的企业技术人员,他们希望了解整个搭建过程的具体步骤和注意事项。 用户的需求不仅仅是理论步骤,可能更关注实际操作中的关键点、常见问题及解决方案。比如,在需求调研阶段,如何准确获取业务需求,或者在据建模时选择哪种模型更合适。此外,用户可能还关心技术选型,比如ETL工具的选择、存储格式、计算引擎等,以及如何保证据质量和性能优化。 接下来,我需要整理搭建的主要步骤。根据之前的回答,高级大据工程师在需求调研和据整理阶段已经有详细流程,所以现在需要扩展到整个搭建过程。通常,从0到1搭建包括需求分析、架构设计、据采集、据建模、ETL开发据存储、据服务、据治理、测试上线和持续优化这几个阶段。 每个阶段都需要详细说明。比如在架构设计时,分结构(ODS、DWD、DWS等)的作用,技术组件的选择依据(如Hadoop生态组件的优缺点)。在据建模部分,维度建模和范式建模的区别,如何根据业务需求选择合适的模型。ETL开发阶段要注意据清洗、转换的具体方法,以及如何优化任务性能。 同时,用户可能对实际案例或示例感兴趣,比如在据分时使用哪种存储格式和压缩方式,分区策略的设计,如何设置据质量校验规则等。需要给出具体的例子,比如使用Parquet格式和Snappy压缩,按日期分区,使用Great Expectations进行据校验等。 还需要考虑据治理方面,如元据管理、据血缘、权限控制等,这些都是长期维护的关键。另外,测试阶段的不同次测试,如单元测试、集成测试、性能测试的具体实施方法,以及上线后的监控和优化措施。 最后,总结整个流程,强调迭代优化的重要性,以及如何根据业务发展调整架构。确保回答结构清晰,步骤明确,结合实际案例和技术细节,帮助用户全面理解搭建的过程,并能够应用到实际项目中。</think>以下是构建企业级数据仓库的完整实施路线,包含关键步骤与技术决策点,以实际工程实践为导向: --- ### 一、需求蓝图搭建 1. **业务需求三维定位** - 绘制 **BI需求矩阵**: | 业务域 | 指标维度 | 时间粒度 | 据延迟要求 | |---|---|---|---| | 销售 | GMV、转化率 | 小时级 | <15分钟 | | 风控 | 欺诈识别率 | 秒级 | 实时流 | - 制作 **用场景地图**(示例): ```mermaid graph TD A[实时大屏] --> B{据更新频率} B -->|每5秒| C[Kafka流处理] B -->|每日| D[Hive批处理] ``` 2. **据源全景扫描** - 建立 **据源档案卡**: ```json { "source_type": "MySQL", "table_count": 48, "QPS峰值": "1200", "据量增长率": "15%/月", "敏感字段标记": ["user_phone", "payment_card"] } ``` --- ### 二、技术架构设计 1. **分架构设计** - 经典五结构: $$ \text{ODS} \xrightarrow{\text{清洗}} \text{DWD} \xrightarrow{\text{维度退化}} \text{DWS} \xrightarrow{\text{聚合}} \text{ADS} \xrightarrow{\text{服务化}} \text{API} $$ - 存储策略矩阵: | 级 | 存储引擎 | 压缩算法 | 生命周期 | |---|---|---|---| | ODS | HDFS+Parquet | Snappy | 30天 | | DWD | Hudi | Zstd | 1年 | | ADS | ClickHouse | LZ4 | 永久 | 2. **计算引擎选型** - 构建 **技术选型决策树**: ``` 是否需要流处理? / \ Yes No / \ 低延迟要求(<100ms)? Hive/SparkSQL / \ Yes No / \ Flink Spark Structured Streaming ``` --- ### 三、据建模实战 1. **维度建模四步法** - **业务过程声明**: ```python # 电商交易业务过程 business_process = { "name": "订单创建", "grain": "每个订单项级别", "facts": ["商品金额", "优惠金额"], "dimensions": ["用户", "商品", "时间"] } ``` - **总线矩阵构建**: | 业务过程 | 日期 | 用户 | 商品 | 店铺 | |---|---|---|---|---| | 下单 | ✓ | ✓ | ✓ | ✓ | | 支付 | ✓ | ✓ | | ✓ | 2. **模型优化技巧** - 使用 **雪花模型 vs 星座模型** 对比: | 模型类型 | 查询性能 | 扩展性 | 存储成本 | |---|---|---|---| | 雪花 | 低 | 高 | 低 | | 星座 | 高 | 中 | 中 | - **预计算策略**: ```sql -- 创建物化视图示例 CREATE MATERIALIZED VIEW dws_user_behavior ENGINE = AggregatingMergeTree PARTITION BY toYYYYMM(login_date) AS SELECT user_id, login_date, countState(page_view) AS pv, sumState(order_amount) AS gm FROM dwd_logs GROUP BY user_id, login_date ``` --- ### 四、ETL工程化实施 1. **据管道设计** - 典型据流架构: ```mermaid graph LR A[Oracle] -->|Sqoop| B[HDFS] C[日志文件] -->|Flume| D[Kafka] D -->|Flink| E[Redis] B -->|Spark| F[Hive] E -->|Presto| G[BI工具] ``` - **任务调度配置**: ```yaml # Airflow DAG配置示例 dag: schedule_interval: '0 3 * * *' max_active_runs: 2 tasks: - task_id: ods_import operator: SparkOperator params: app_name: ods_import sql: "INSERT OVERWRITE TABLE ods.sales SELECT * FROM src.sales WHERE dt='{{ ds }}'" ``` 2. **据质量保障** - 建立 **三校验体系**: 1. **字段级**: ```python # 使用Great Expectations规则 expectation_config = { "expectation_type": "expect_column_values_to_not_be_null", "kwargs": {"column": "user_id"} } ``` 2. **记录级**: ```sql -- 外键约束检查 SELECT COUNT(*) FROM fact_orders f LEFT JOIN dim_user u ON f.user_id = u.user_id WHERE u.user_id IS NULL ``` 3. **业务级**: ```python # 同比波动率告警 if abs(current_gmv - last_year_gmv)/last_year_gmv > 0.2: trigger_alert("GMV异常波动") ``` --- ### 五、据服务化输出 1. **统一据服务** - 构建 **API网关架构**: ``` ┌─────────────┐ ┌───────────┐ │ BI工具 │───SQL─▶ Presto │ ├─────────────┤ ├───────────┤ │ 应用系统 │──REST─▶ API Gateway └─────────────┘ └───────────┘ ``` - **查询优化方案**: | 场景 | 优化手段 | 效果 | |---|---|---| | 高并发点查 | HBase二级索引 | 响应时间↓80% | | 复杂分析 | Prezo动态分桶 | 查询耗时↓65% | --- ### 六、持续运维体系 1. **元据管理** - 构建 **据血缘图谱**: ```mermaid graph LR A[源系统订单表] --> B{ETL作业} B --> C[DWD订单事实表] C --> D[ADS区域销量汇总] D --> E[大屏可视化] ``` - **存储成本优化**: ```bash # HDFS冷热据分级 hdfs storagepolicies -setStoragePolicy -path /data/hot -policy ALL_SSD hdfs storagepolicies -setStoragePolicy -path /data/cold -policy COLD ``` --- ### 实施路线图示例 | 阶段 | 里程碑 | 交付物 | |---|---|---| | 1个月 | 基础设施就绪 | 集群部署文档、据接入白皮书 | | 3个月 | 核心模型上线 | 维度建模规范、ETL调度体系 | | 6个月 | 服务化完成 | API网关、据产品目录 | | 1年 | 智慧运营 | 据质量监控平台、自助分析体系 | 整个建设过程需要遵循 **"小步快跑,持续迭代"** 原则,建议首期聚焦核心业务域快速产出价值,后续逐步扩展据域。同时建立 **据资产健康度看板**,持续监控存储成本、查询性能、据新鲜度等关键指标。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值