数据分析案例:APP热点标签分析

文章目录

          • 一、需求分析
          • 二、主要思路及难点
          • 三、主要流程:
          • 四、开发过程:
            • 整个案例结构:
            • 具体操作流程(Linux系统上)
          • 五、优化

一、需求分析
  • 给定一批App名称及其描述信息,共52.9万条数据(爬虫爬取App Store的数据)
  • 共包含6个字段,分别为AppId(id),App名称(name),一级分类(first_classify ),二级分类(second_classify ),三级分类(third_classify ),Tags描述信息(tags )
  • 通过hive数据仓库命令行形式,完成数据加载、统计分析的任务。
二、主要思路及难点

主要思路:

  • 通过hive命令将数据加到数据仓库中
  • 使用hql+udf/udaf/udtf完成统计分析
  • 将统计分析结果插入到hive中自建的新表中

主要难点:

  • 数据仓库的目录结构和开发规范
  • hive及HiveSQl常用命令
  • 系统函数+udf/udaf/udtf灵活使用
  • hive常见问题的解决
三、主要流程:

思路分析:

  • 爬虫爬取App Store的数据(数据准备工作)
  • 创建对应的数据输入表app_tag_meta_info(create)
  • 创建一个输出表hot_tag_rank_info用保存"标签和标签量"
  • 对表app_tag_meta_info进行数据处理,产生数据保存到表hot_tag_rank_info中(deal)
四、开发过程:
整个案例结构:
├── 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包(此案例未涉及到)
具体操作流程(Linux系统上)

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. 创建对应的脚本文件

  • set_env.sh hive启动脚本
#! /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
  • app_tag_meta_info.sh
    创建输入表脚本,外部表(将原始数据加载到此表中),通过时间进行分区
    字段:AppId(id),App名称(name),一级分类(first_classify ),二级分类(second_classify ),三级分类(third_classify ),Tags描述信息(tags )

脚本文件:

#! /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
  • hot_tag_rank_info.sh
    创建输出表脚本,内部表(将输入表中处理过的数据加载到此表中),通过时间进行分区,输出表的结构为textfile格式。
    字段:Tags名称(tag ),频率(freq )

脚本文件:

#! /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
  • produce_app_tag_meta_info.sh
    将源数据加载到输入表app_tag_meta_info中的脚本

脚本文件:

#! /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')
   ;
"
  • produce_hot_tag_rank_info.sh
    将对输入表中tags字段分析的结果加载到输出表hot_tag_rank_info中

脚本文件:

#! /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)

  • a_main.sh 脚本入口

脚本文件:

#! /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
  • hot_tag_rank_rcfile_info.sh 将输出表以rcfile格式存储
#! /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
  • produce_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
	;
"
  • a_main.sh
#! /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
...

你可能感兴趣的:(数据分析案例:APP热点标签分析)