(31)数仓搭建-DWD 层

1 )对用户行为数据解析。
2 )对核心数据进行判空过滤。
3 )对业务数据采用 维度模型 重新建模。
1. DWD 层(用户行为日志解析)
1.1 日志格式回顾
1 )页面埋点日志

(2)启动日志

 

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
3.启动日志
启动日志解析思路: 启动日志表中每行数据对应 一个启动记录 ,一个启动记录应该包含
日志中的 公共信息和启动信息 。先将 所有包含 start 字段的日志过滤出来 ,然后使用
get_json_object 函数解析每个字段。

 

1 )建表语句
hive (gmall)>
drop table if exists dwd_start_log;
CREATE EXTERNAL TABLE dwd_start_log(
`area_code` string COMMENT ' 地区编码 ' ,
`brand` string COMMENT ' 手机品牌 ' ,
`channel` 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 parquet -- 采用 parquet 列式存储
LOCATION '/warehouse/gmall/dwd/dwd_start_log' -- 指定在 HDFS 上存储位置
TBLPROPERTIES('parquet.compression'= 'lzo' ) -- 采用 LZO 压缩
;
说明:数据采用 parquet 存储方式,是可以支持切片的,不需要再对数据创建索引。如
果单纯的 text 方式存储数据,需要采用支持切片的, lzop 压缩方式并创建索引。
2 )数据导入
hive (gmall)>
SET hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFo
rmat;
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.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;
3)查看数据
hive (gmall)>
select * from dwd_start_log where dt='2020-06-14' limit 2;
4 Hive 读取索引文件问题
1 )两种方式,分别查询数据有多少行

 

2 )两次查询结果不一致。
原因是 select * from ods_log 不执行 MR 操作,默认采用的是 ods_log 建表语句中指定的
DeprecatedLzoTextInputFormat ,能够识别 lzo.index 为索引文件。
select count(*) from ods_log 执行 MR 操作,默认采用的是 CombineHiveInputFormat ,不
能识别 lzo.index 为索引文件,将索引文件当做普通文件处理。 更严重的是,这会导致 LZO
文件无法切片。
 
解决办法:修改 CombineHiveInputFormat HiveInputFormat
3 )再次测试

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大数据开发工程师-宋权

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

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

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

打赏作者

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

抵扣说明:

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

余额充值