1. 数据仓库DWD层数据装载实战解析在大数据仓库建设中DWDData Warehouse Detail层作为数据仓库明细层承担着原始数据清洗转换和轻度汇总的重要职责。本文将深入剖析两个核心脚本首日全量装载脚本(ods_to_dwd_init.sh)和每日增量装载脚本(ods_to_dwd.sh)带你掌握电商领域数据仓库构建的关键技术细节。提示本文基于Hive 3.x环境所有SQL均采用动态分区模式适用于日均千万级交易数据的电商场景。2. 首日全量装载脚本设计精要2.1 脚本架构设计首日装载脚本采用模块化设计主要包含以下技术组件参数校验模块检查日期参数是否传入SQL语句块定义各业务域的DWD表装载逻辑执行控制模块通过case语句选择执行特定表或全部表#!/bin/bash APPgmall if [ -n $2 ] ;then do_date$2 else echo 请传入日期参数 exit fi2.2 核心业务逻辑实现2.2.1 购物车业务处理购物车初始化装载需要考虑两种数据来源全量表(ods_cart_info_full)装载未下单的购物车商品增量表(ods_cart_info_inc)捕获购物车新增记录-- 购物车增量表处理 dwd_trade_cart_add_inc set hive.exec.dynamic.partition.modenonstrict; insert overwrite table ${APP}.dwd_trade_cart_add_inc partition (dt) select data.id, data.user_id, data.sku_id, date_format(data.create_time, yyyy-MM-dd) date_id, data.create_time, data.sku_num, date_format(data.create_time, yyyy-MM-dd) from ${APP}.ods_cart_info_inc where dt $do_date and type bootstrap-insert; -- 购物车全量表处理 dwd_trade_cart_full insert overwrite table ${APP}.dwd_trade_cart_full partition(dt$do_date) select id, user_id, sku_id, sku_name, sku_num from ${APP}.ods_cart_info_full where dt$do_date and is_ordered0; 2.2.2 订单业务处理订单明细表需要关联多个维度表获取完整信息订单主表(ods_order_info_inc)订单活动表(ods_order_detail_activity_inc)订单优惠券表(ods_order_detail_coupon_inc)dwd_trade_order_detail_inc set hive.exec.dynamic.partition.modenonstrict; insert overwrite table ${APP}.dwd_trade_order_detail_inc partition (dt) select od.id, order_id, user_id, sku_id, province_id, activity_id, activity_rule_id, coupon_id, date_format(create_time, yyyy-MM-dd) date_id, create_time, sku_num, split_original_amount, nvl(split_activity_amount,0.0), nvl(split_coupon_amount,0.0), split_total_amount, date_format(create_time,yyyy-MM-dd) from (...)2.3 执行与权限控制脚本执行前需要赋予可执行权限chmod x ods_to_dwd_init.sh执行方式支持两种模式全量执行ods_to_dwd_init.sh all 2022-06-08单表执行ods_to_dwd_init.sh dwd_trade_order_detail_inc 2022-06-083. 每日增量装载脚本技术解析3.1 增量处理核心逻辑每日脚本相比首日脚本主要差异点日期参数默认处理昨日数据增量条件改为typeinsert或typeupdate支付状态等业务字段需要判断变更#!/bin/bash APPgmall # 智能日期处理支持手动传入或自动取昨日 if [ -n $2 ] ;then do_date$2 else do_datedate -d -1 day %F fi3.2 典型业务场景实现3.2.1 支付成功订单处理支付业务需要特别注意关联支付流水表和订单明细表筛选支付状态变为成功的记录获取支付方式字典信息dwd_trade_pay_detail_suc_inc insert overwrite table ${APP}.dwd_trade_pay_detail_suc_inc partition (dt$do_date) select od.id, od.order_id, user_id, sku_id, province_id, activity_id, activity_rule_id, coupon_id, payment_type, pay_dic.dic_name, date_format(callback_time,yyyy-MM-dd) date_id, callback_time, sku_num, split_original_amount, nvl(split_activity_amount,0.0), nvl(split_coupon_amount,0.0), split_total_amount from (...) where dt$do_date and typeupdate and array_contains(map_keys(old),payment_status) and data.payment_status16023.2.2 交易流水累积表交易流水表采用特殊设计保留历史未完成订单dt9999-12-31每日增量更新订单状态三阶段状态更新下单→支付→完成dwd_trade_trade_flow_acc set hive.exec.dynamic.partition.modenonstrict; insert overwrite table ${APP}.dwd_trade_trade_flow_acc partition(dt) select oi.order_id, user_id, province_id, order_date_id, order_time, nvl(oi.payment_date_id,pi.payment_date_id), nvl(oi.payment_time,pi.payment_time), nvl(oi.finish_date_id,log.finish_date_id), nvl(oi.finish_time,log.finish_time), order_original_amount, order_activity_amount, order_coupon_amount, order_total_amount, nvl(oi.payment_amount,pi.payment_amount), nvl(nvl(oi.finish_time,log.finish_time),9999-12-31) from (...)3.3 执行优化建议并行执行对于大型数据仓库可以拆分不同业务域脚本并行执行错误重试增加重试机制处理临时性Hive执行错误执行监控记录每个表的执行耗时和数据处理量4. 关键问题排查指南4.1 常见错误及解决方案错误现象可能原因解决方案分区创建失败动态分区未开启执行set hive.exec.dynamic.partition.modenonstrict;数据重复增量条件设置不当检查type条件和业务状态变更判断关联字段丢失关联键不匹配验证表间关联字段的数据一致性日期格式异常时区未统一使用from_utc_timestamp统一转换为本地时区4.2 性能优化实践小文件合并在装载后执行ANALYZE TABLE收集统计信息JOIN优化对大数据量表使用MAPJOIN提示/* MAPJOIN(oi) */ left join ${APP}.ods_order_info_inc oi并行执行设置set hive.exec.paralleltrue;内存配置根据数据量调整mapreduce.map.memory.mb等参数5. 实际应用中的经验总结版本控制将脚本纳入Git管理记录每次变更的业务背景参数校验增加日期格式校验避免非法日期导致数据异常执行日志记录脚本执行开始结束时间、处理行数等关键指标数据质量在关键表装载后增加数据量波动检查# 示例数据量检查 hive -e select count(*) from ${APP}.dwd_trade_order_detail_inc where dt$do_date这两个脚本构成了数据仓库DWD层的基础框架在实际项目中可以根据业务需求进行扩展增加数据质量检查步骤集成调度系统如Azkaban或Airflow添加异常报警机制扩展历史数据回溯功能
阅读完成 · 觉得有帮助?