背景介绍
陌陌作为聊天平台每天都会有大量用户在线,会出现大量的聊天数据,通过对聊天数据分析,可以更好的构建精确的用户画像,为用户提供更好的服务以及实现高ROI(投资回报率)的平台运营推广,给公司的发展决策提供精确的数据支撑。
目标:
基于Hadoop和Hive实现聊天数据分析,构建聊天数据分析报表。
需求:
统计今日总消息量
统计今日每小时消息量、发送和接收用户数
统计今日各地区发送消息数据量
统计今日发送消息和接收消息的用户数
统计今日发送消息最多的top10用户
统计接收消息最多的top10用户
统计发送人的手机型号
统计发送人的设备操作系统分布
原始数据:
数据来源,聊天业务系统中到处的一天24小时的用户聊天数据,以tsv文本形式存储。
1、建库建表、加载数据
--------------1、建库-------------------
--如果数据库已存在就删除
drop database if exists db_msg cascade;
--创建数据库
create database db_msg;
--切换数据库
use db_msg;
--------------2、建表-------------------
--如果表已存在就删除
drop table if exists db_msg.tb_msg_source;
--建表
create table db_msg.tb_msg_source(
msg_time string comment "消息发送时间"
, sender_name string comment "发送人昵称"
, sender_account string comment "发送人账号"
, sender_sex string comment "发送人性别"
, sender_ip string comment "发送人ip地址"
, sender_os string comment "发送人操作系统"
, sender_phonetype string comment "发送人手机型号"
, sender_network string comment "发送人网络类型"
, sender_gps string comment "发送人的GPS定位"
, receiver_name string comment "接收人昵称"
, receiver_ip string comment "接收人IP"
, receiver_account string comment "接收人账号"
, receiver_os string comment "接收人操作系统"
, receiver_phonetype string comment "接收人手机型号"
, receiver_network string comment "接收人网络类型"
, receiver_gps string comment "接收人的GPS定位"
, receiver_sex string comment "接收人性别"
, msg_type string comment "消息类型"
, distance string comment "双方距离"
, message string comment "消息内容"
)
--指定分隔符为制表符
row format delimited fields terminated by '\t';
--------------3、加载数据-------------------
--上传数据文件到node1服务器本地文件系统(HS2服务所在机器)
--shell: mkdir -p /root/hivedata
--加载数据到表中
load data local inpath '/hivedata/data1.tsv' into table db_msg.tb_msg_source;
load data local inpath '/root/hivedata/data2.tsv' into table db_msg.tb_msg_source;
--查询表 验证数据文件是否映射成功
select * from tb_msg_source limit 10;
2、ETL数据清洗
抽取、转换、加载数据
数据问题:
当前数据中,有一些数据的字段为空,是否为合法数据?
合法和不合法有一个判断标准,这些字段是否有利于这次数据分析,是不是能够支撑你本次分析,如果该次分析不涉及该字段,则不用考虑该这段是否合法,要是设计该字段,那么为不合法数据。
使用where length()解决
将字段拆分解决
拆分字段解决。
针对以上问题,我们将字段拆分出来形成一张新表。使用CTAS语法
这样可以省去我们建表的步骤,直接将原表的字段进行操作形成新表。
create table 新表名
as select 字段... from 目标表名 where...
--ETL实现
--如果表已存在就删除
drop table if exists db_msg.tb_msg_etl;
--将Select语句的结果保存到新表中
create table db_msg.tb_msg_etl as
select
*,
substr(msg_time,0,10) as dayinfo, --获取天 2021-11-01
substr(msg_time,12,2) as hourinfo, --获取小时
split(sender_gps,",")[0] as sender_lng, --提取经度
split(sender_gps,",")[1] as sender_lat --提取纬度
from db_msg.tb_msg_source
--过滤字段为空的数据
where length(sender_gps) > 0 ;
需求
需求:
统计今日总消息量
统计今日每小时消息量、发送和接收用户数
统计今日各地区发送消息数据量
统计今日发送消息和接收消息的用户数
统计今日发送消息最多的top10用户
统计接收消息最多的top10用户
统计发送人的手机型号
统计发送人的设备操作系统分布
--------------5、需求指标统计分析-------------------
--需求:统计今日总消息量
create table if not exists tb_rs_total_msg_cnt
comment "今日消息总量" -- 表的注释
as
select
dayinfo,
count(*) as total_msg_cnt
from db_msg.tb_msg_etl
group by dayinfo;
select * from tb_rs_total_msg_cnt;--结果验证
--需求:统计今日每小时消息量、发送和接收用户数
create table if not exists tb_rs_hour_msg_cnt
comment "每小时消息量趋势"
as
select
dayinfo,
hourinfo,
count(*) as total_msg_cnt,
count(distinct sender_account) as sender_usr_cnt,
count(distinct receiver_account) as receiver_usr_cnt
from db_msg.tb_msg_etl
group by dayinfo,hourinfo;
select * from tb_rs_hour_msg_cnt;--结果验证
--需求:统计今日各地区发送消息数据量
create table if not exists tb_rs_loc_cnt
comment "今日各地区发送消息总量"
as
select
dayinfo,
sender_gps,
cast(sender_lng as double) as longitude,
cast(sender_lat as double) as latitude,
count(*) as total_msg_cnt
from db_msg.tb_msg_etl
group by dayinfo,sender_gps,sender_lng,sender_lat;
select * from tb_rs_loc_cnt; --结果验证
--需求:统计今日发送消息和接收消息的用户数
create table if not exists tb_rs_usr_cnt
comment "今日发送消息人数、接受消息人数"
as
select
dayinfo,
count(distinct sender_account) as sender_usr_cnt,
count(distinct receiver_account) as receiver_usr_cnt
from db_msg.tb_msg_etl
group by dayinfo;
select * from tb_rs_usr_cnt; --结果验证
--需求:统计今日发送消息最多的Top10用户
create table if not exists tb_rs_susr_top10
comment "发送消息条数最多的Top10用户"
as
select
dayinfo,
sender_name as username,
count(*) as sender_msg_cnt
from db_msg.tb_msg_etl
group by dayinfo,sender_name
order by sender_msg_cnt desc
limit 10;
select * from tb_rs_susr_top10; --结果验证
--需求:统计今日接收消息最多的Top10用户
create table if not exists tb_rs_rusr_top10
comment "接受消息条数最多的Top10用户"
as
select
dayinfo,
receiver_name as username,
count(*) as receiver_msg_cnt
from db_msg.tb_msg_etl
group by dayinfo,receiver_name
order by receiver_msg_cnt desc
limit 10;
select * from tb_rs_rusr_top10; --结果验证
--需求:统计发送人的手机型号分布情况
create table if not exists tb_rs_sender_phone
comment "发送人的手机型号分布"
as
select
dayinfo,
sender_phonetype,
count(distinct sender_account) as cnt
from tb_msg_etl
group by dayinfo,sender_phonetype;
select * from tb_rs_sender_phone; --结果验证
--需求:统计发送人的设备操作系统分布情况
create table if not exists tb_rs_sender_os
comment "发送人的OS分布"
as
select
dayinfo,
sender_os,
count(distinct sender_account) as cnt
from tb_msg_etl
group by dayinfo,sender_os;
select * from tb_rs_sender_os; --结果验证
Fine BI
fine BI 是帆软软件公司的一款商业智能(business Intelligence)产品,定位于自助大数据分析BI工具,能够帮助企业的业务人员和数据分析师开展以问题为导向的探索式分析。
就是一个可以集成hive可视化软件,将hive中的数据展示出来,这款软件有很多模板使用。
这个没啥好记录的,不同公司使用的软件不同。
学习总结:
学习了hadoop,这个主要是搭建环境,其他的底层执行逻辑稍微明白一些就行,不影响使用。
然后学习了hive,这个主要和hadoop集成使用,主要目的就是将结构化的文件转换为数据表。然后一些sql的使用。
最后这个demo呢,就是使用Fine BI将上面的数据读取出来,做成可视化图表展示。