主要思路:
主要难点:
思路分析:
├── app_hot_tags_analysis ## app热点标签分析根目录
│
├── config ## 存放相关配置变量
│ └── set_env.sh ## hive启动脚本
├── create ## 存放表结构数据
│ ├── app_tag_meta_info.sh ## 输入表
│ ├── hot_tag_rank_info.sh ## 输出表(textfile格式)
│ └── hot_tag_rank_rcfile_info.sh ## 输出表(rcfile格式)
├── deal ## 具体的sql脚本文件
│ ├── a_main.sh ## 整个脚本执行的入口,相当于Java中的主函数入口main()一样
│ ├── app_abstract_info.txt ## 源数据文件(528270条数据)
│ ├── produce_app_tag_meta_info.sh ## 将源数据文件加载到输入表的脚本文件
│ ├── produce_hot_tag_rank_info.sh ## 将输入表中处理好的数据加载到输出表(textfile格式)的脚本文件
│ └── produce_hot_tag_rank_rcfile_info.sh ## 输入表中处理好的数据加载到输出表(rcfile格式)的脚本文件
└── udf ## udf/udaf/udtf 相关的jar包(此案例未涉及到)
1. 创建相关目录
在/opt/目录下创建此工程的总目录app_hot_tags_analysis及其子目录
$ cd /opt/
$ mkdir app_hot_tags_analysis
$ cd app_hot_tags_analysis
$ mkdir config create deal udf
在每个子目录中创建各自对应的脚本文件
$ cd config/
$ touch set_env.sh
$ cd create/
$ touch app_tag_meta_info.sh
$ touch hot_tag_rank_info.sh
$ touch hot_tag_rank_rcfile_info.sh
$ cd deal/
$ touch a_main.sh
$ touch produce_app_tag_meta_info.sh
$ touch produce_hot_tag_rank_info.sh
$ touch produce_hot_tag_rank_rcfile_info.sh
2. 创建对应的脚本文件
#! /bin/bash
HIVE='/opt/modules/cdh/hive-1.1.0-cdh5.16.1/bin/hive'
使此脚本有效:
$ source set_env.sh
可以通过此命令 which hive查看hive启动命令路径
$ which hive
/opt/modules/cdh/hive-1.1.0-cdh5.16.1/bin/hive
脚本文件:
#! /bin/bash
source ../config/set_env.sh
db="app_hot"
table_name="app_tag_meta_info"
$HIVE -e "
use $db;
create external table $table_name(
id string,
name string,
first_classify string,
second_classify string,
third_classify string,
tags string
)
partitioned by (dt string comment 'update date')
row format delimited fields terminated by '\t'
lines terminated by '\n'
stored as textfile;
"
执行命令:
$ sh app_tag_meta_info.sh
脚本文件:
#! /bin/bash
source ../config/set_env.sh
db="app_hot"
table_name="hot_tag_rank_info"
$HIVE -e "
use $db;
create table $table_name(
tag string,
freq int
)
partitioned by (dt string comment 'update date')
row format delimited fields terminated by '\t'
lines terminated by '\n'
stored as textfile;
"
执行命令:
$ sh hot_tag_rank_info.sh
脚本文件:
#! /bin/bash
source ../config/set_env.sh
updateDT=$1
db="app_hot"
table_name="app_tag_meta_info"
data_source_path="app_abstract_info.txt"
$HIVE -e "
use $db;
load data local inpath '$data_source_path'
overwrite into table $table_name
partition(dt='$updateDT')
;
"
脚本文件:
#! /bin/bash
source ../config/set_env.sh
updateDT=$1
db="app_hot"
input_table_name="app_tag_meta_info"
output_table_name="hot_tag_rank_info"
$HIVE -e "
use $db;
## Hive执行本地操作模式,可以避免进行MapReduce
set hive.exec.mode.local.auto=true;
insert overwrite table $output_table_name partition(dt='$updateDT')
select tag,count(1) as freq from $input_table_name
lateral view explode(split(tags,',')) tag_table as tag
where tag!='' and tag!='-' and dt='$updateDT'
group by tag
order by freq desc
;
"
分析:
step1:找到tag字段
select tags from app_tag_meta_info limit 10;
结果:
tags
体育,
搜索,
乐视,
租房,周边信息,生活服务,招聘,实用工具,生活,同城,求职,二手物品,房产,
票务,
团购,视频,优惠,购票,购物,选座,娱乐,影院,电影票,
交友,
,票务,导购,
Time taken: 0.157 seconds, Fetched: 10 row(s)
#==============================================================#
step2:拆分字段
select explode(split(tags,',')) as tag from app_tag_meta_info limit 10;
结果:
tag
体育
搜索
乐视
租房
周边信息
Time taken: 0.143 seconds, Fetched: 10 row(s)
#==============================================================#
step3:用lateral view包装
select tag from app_tag_meta_info
lateral view explode(split(tags,',')) tag_table as tag limit 10;
结果:
tag
体育
搜索
乐视
租房
周边信息
Time taken: 0.167 seconds, Fetched: 10 row(s)
#==============================================================#
//step4:bug解决和优化
select tag from app_tag_meta_info
lateral view explode(split(tags,',')) tag_table as tag
where tag!='' and tag!='-' group by tag limit 10;
结果:
tag
&
(Asia)
(Demo)
(E)
(JE)
(Lite)
(OFFICIAL)
(Shoot
(USA)
(Unl)
Time taken: 3.756 seconds, Fetched: 10 row(s)
#==============================================================#
//step5:按频次倒排
select tag,count(1) as freq from app_tag_meta_info
lateral view explode(split(tags,',')) tag_table as tag
where tag!='' and tag!='-' and dt='20190523'
group by tag order by freq desc limit 10;
结果:
tag freq
休闲益智 36299
生活 21308
实用工具 6554
工具 6510
动作竞技 5513
休闲 5367
学习 5288
益智 4691
全部游戏 4470
射击冒险 4353
Time taken: 5.55 seconds, Fetched: 10 row(s)
脚本文件:
#! /bin/bash
#得到当前日期
currentDT=`date +%Y%m%d`
echo "当前日期为: "$currentDT
#将文本文件数据加载到app_tag_meta_info表中
echo "start load data to table process"
sh produce_app_tag_meta_info.sh $currentDT
echo "end"
#生成统计排序的热度标签数据
echo "start insert tag rank data"
sh produce_hot_tag_rank_info.sh $currentDT
echo "end"
echo "all done!"
执行:
$ sh a_main.sh
查看输入表(app_tag_meta_info )中数据:
hive (app_hot)> select * from app_tag_meta_info limit 10;
OK
app_tag_meta_info.id app_tag_meta_info.name app_tag_meta_info.first_classify app_tag_meta_info.second_classify app_tag_meta_info.third_classify app_tag_meta_info.tags app_tag_meta_info.dt
com.letv.android.client 乐视视频 软件 图像影音 视频 20190523
com.letv.android.client.pad 乐视视频HD 软件 图像影音 视频 体育, 20190523
com.letv.tvos.appstore 乐视应用商店 软件 系统性能 工具 搜索, 20190523
com.telecom.video.lsysdx 乐视影视电信版 软件 图像影音 视频 20190523
com.letv.cloud.disk 乐视云盘 软件 办公商务 存储 乐视, 20190523
com.wuba 58同城 软件 通信社交 社交 租房,周边信息,生活服务,招聘,实用工具,生活,同城,求职,二手物品,房产, 20190523
com.godyj.lottery 彩票大赢家2015 软件 金融理财 彩票 票务, 20190523
com.sankuai.movie 猫眼电影 软件 便捷生活 生活 团购,视频,优惠,购票,购物,选座,娱乐,影院,电影票, 20190523
com.accuvally.hdtui 活动行 软件 便捷生活 社交 交友, 20190523
com.dyjwqwtc.lottery 竞彩大赢家 软件 便捷生活 生活 ,票务,导购, 20190523
Time taken: 0.138 seconds, Fetched: 10 row(s)
查看输出表(hot_tag_rank_info )中数据:
hive (app_hot)> select * from hot_tag_rank_info limit 10;
OK
hot_tag_rank_info.tag hot_tag_rank_info.freq hot_tag_rank_info.dt
休闲益智 36299 20190523
生活 21308 20190523
实用工具 6554 20190523
工具 6510 20190523
动作竞技 5513 20190523
休闲 5367 20190523
学习 5288 20190523
益智 4691 20190523
全部游戏 4470 20190523
射击冒险 4353 20190523
Time taken: 0.22 seconds, Fetched: 10 row(s)
查看输出表(hot_tag_rank_info )文件大小
hive (app_hot)> show create table hot_tag_rank_rcfile_info;
LOCATION
'hdfs://bigdatademo:8020/user/hive/warehouse/app_hot.db/hot_tag_rank_rcfile_info'
$ hdfs dfs -ls /user/hive/warehouse/app_hot.db/hot_tag_rank_info/dt=20190523
-rwxr-xr-x 1 root supergroup 245571 2019-05-23 17:08 /user/hive/warehouse/app_hot.db/hot_tag_rank_info/dt=20190523/000000_0
#! /bin/bash
source ../config/set_env.sh
db="app_hot"
table_name="hot_tag_rank_rcfile_info"
$HIVE -e "
use $db;
create table $table_name(
tag string,
freq int
)
partitioned by (dt string comment 'update date')
stored as rcfile;
"
执行命令:
$ sh hot_tag_rank_rcfile_info.sh
#! /bin/bash
source ../config/set_env.sh
updateDT=$1
db="app_hot"
input_table_name="app_tag_meta_info"
output_table_name="hot_tag_rank_rcfile_info"
$HIVE -e "
use $db;
#Hive执行本地操作模式,可以避免进行MapReduce
set hive.exec.mode.local.auto=true;
insert overwrite table $output_table_name partition(dt='$updateDT')
select tag,count(1) as freq from $input_table_name
lateral view explode(split(tags,',')) tag_table as tag
where tag!='' and tag!='-' and dt='$updateDT'
group by tag
order by freq desc
;
"
#! /bin/bash
#得到当前日期
currentDT=`date +%Y%m%d`
echo "当前日期为: "$currentDT
#将文本文件数据加载到app_tag_meta_info表中
echo "start load data to table process"
sh produce_app_tag_meta_info.sh $currentDT
echo "end"
#生成统计排序的热度标签数据
echo "start insert tag rank data"
sh produce_hot_tag_rank_rcfile_info.sh $currentDT
echo "end"
echo "all done!"
执行:
$ sh a_main.sh
查看输出表(hot_tag_rank_rcfile_info )中数据:
hive (app_hot)> select * from hot_tag_rank_rcfile_info limit 10;
OK
hot_tag_rank_rcfile_info.tag hot_tag_rank_rcfile_info.freq hot_tag_rank_rcfile_info.dt
休闲益智 36299 20190523
生活 21308 20190523
实用工具 6554 20190523
工具 6510 20190523
动作竞技 5513 20190523
休闲 5367 20190523
学习 5288 20190523
益智 4691 20190523
全部游戏 4470 20190523
射击冒险 4353 20190523
Time taken: 0.533 seconds, Fetched: 10 row(s)
查看输出表(hot_tag_rank_rcfile_info)文件大小
hive (app_hot)> show create table hot_tag_rank_rcfile_info;
LOCATION
'hdfs://bigdatademo:8020/user/hive/warehouse/app_hot.db/hot_tag_rank_rcfile_info'
# hdfs dfs -ls /user/hive/warehouse/app_hot.db/hot_tag_rank_rcfile_info/dt=20190523
-rwxr-xr-x 1 root supergroup 222904 2019-05-23 17:45 /user/hive/warehouse/app_hot.db/hot_tag_rank_rcfile_info/dt=20190523/000000_0
可以发现以rcfile格式输出的文件具有压缩能力,比textfile格式所占存储空间要小
查看rcfile文件出现乱码
$ hdfs dfs -text /user/hive/warehouse/app_hot.db/hot_tag_rank_rcfile_info/dt=20190523/* | more
RCF
? þ
þ þ^L þ
查看textfile文件不会出现乱码
$ hdfs dfs -text /user/hive/warehouse/app_hot.db/hot_tag_rank_info/dt=20190523/* | more
休闲益智 36299
生活 21308
实用工具 6554
工具 6510
...
可以通过hive --service rcfilecat 命令查看rcfile文件,不乱码
$ hive --service rcfilecat /user/hive/warehouse/app_hot.db/hot_tag_rank_rcfile_info/dt=20190523/000000_0 | more
休闲益智 36299
生活 21308
实用工具 6554
工具 6510
...