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
)再次测试