电商数仓(ods 层)

本文详细介绍了电商数仓的ods层,包括其主要作用、数据压缩方式、分区表的使用以及外部表的创建。重点讲解了用户行为数据如启动日志、事件日志的处理,以及订单、用户、商品等25张业务数据表的构成。强调了lzo压缩、索引创建的重要性,并总结了ods层设计的关键点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、ods 层介绍

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

二、用户行为数据

1、启动日志表 ods_start_log

// 创建启动日志表 ods_start_log
// 创建输入数据是 lzo,输出是 text,支持 json 解析的分区表
DROP table if exists ods_start_log;
CREATE EXTERNAL TABLE ods_start_log (`line` string) 
PARTITIONED BY (`dt` string)
STORED AS 
	INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat' 
	OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' 
LOCATION '/warehouse/gmall/ods/ods_start_log';

// 加载数据
load data inpath '/origin_data/gmall/log/topic_start/2020-03-10' into table gmall.ods_start_log partition(dt='2020-03-10');

// 为 lzo 压缩文件创建索引
hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /warehouse/gmall/ods/ods_start_log/dt=2020-03-10

2、事件日志表 ods_event_log

// 创建事件日志表 ods_event_log
// 创建输入数据是 lzo,输出是 text,支持 json 解析的分区表
drop table if exists ods_event_log; 
CREATE EXTERNAL TABLE ods_event_log(`line` string) 
PARTITIONED BY (`dt` string) 
STORED AS 
	INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat' 
	OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' 
LOCATION '/warehouse/gmall/ods/ods_event_log';

// 加载数据
load data inpath '/origin_data/gmall/log/topic_event/2020-03-10' into table gmall.ods_event_log partition(dt='2020-03-10'); 

// 为 lzo 压缩文件创建索引
hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /warehouse/gmall/ods/ods_event_log/dt=2020-03-10

3、ods层 用户行为数据加载脚本 hdfs_to_ods_log.sh

#!/bin/bash 

# 定义变量方便修改 
APP=gmall 
hive=/opt/module/hive/bin/hive 

# 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天 
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/gmall/log/topic_start/$do_date' overwrite into table ${APP}.ods_start_log partition(dt='$do_date'); 

load data inpath '/origin_data/gmall/log/topic_event/$do_date' overwrite into table ${APP}.ods_event_log partition(dt='$do_date');
"
$hive -e "$sql" 

hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /warehouse/gmall/ods/ods_start_log/dt=$do_date
hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /warehouse/gmall/ods/ods_event_log/dt=$do_date 

4、为什么要对 lzo 数据创建索引?
lzo 文件默认不支持 split,创建索引后支持 split,这样作为 map 输入时就可以将文件分割成多个 map,否则只能有一个 map。

三、业务数据

1、订单表 ods_order_info (增量及更新)

drop table if exists ods_order_info;
create external table ods_order_info ( 
	`id` string COMMENT '订单号', 
	`final_total_amount` decimal(10,2) COMMENT '订单金额', 
	`order_status` string COMMENT '订单状态', 
	`user_id` string COMMENT '用户id', 
	`out_trade_no` string COMMENT '支付流水号', 
	`create_time` string COMMENT '创建时间', 
	`operate_time` string COMMENT '操作时间', 
	`province_id` string COMMENT '省份ID', 
	`benefit_reduce_amount` decimal(10,2) COMMENT '优惠金额', 
	`original_total_amount` decimal(10,2) COMMENT '原价金额', 
	`feight_fee` decimal(10,2) COMMENT '运费' 
) COMMENT '订单表' 
PARTITIONED BY (`dt` string) 
row format delimited fields terminated by '\t' 
STORED AS 
	INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat' 
	OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' 
location '/warehouse/gmall/ods/ods_order_info/';

2、订单详情表 ods_order_detail (增量)

drop table if exists ods_order_detail; 
create external table ods_order_detail( 
	`id` string COMMENT '订单编号', 
	`order_id` string COMMENT '订单号', 
	`user_id` string COMMENT '用户id', 
	`sku_id` string COMMENT '商品id', 
	`sku_name` string COMMENT '商品名称', 
	`order_price` decimal(10,2) COMMENT '商品价格', 
	`sku_num` bigint COMMENT '商品数量', 
	`create_time` string COMMENT '创建时间' 
) COMMENT '订单详情表' 
PARTITIONED BY (`dt` string) 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值