Hive实战(使用30w条聊天数据构建分析报表 ,附加BUG解决)

看的黑马的视频做的笔记:

视频:第四章-09-[实操]DataGrip&DBeaver连接HiveServer2使用_哔哩哔哩_bilibili

资源:百度网盘 请输入提取码


1. 准备工作

1.1 环境准备

在各服务器一键启动hadoop组件

start-all.sh

在hive安装的服务器上,首先启动metastore服务,然后启动hiveserver2服务
(便于后面使用图像化软件管理hive)

进入hive文件夹下

cd /export/server

启动metastore和hiveserver2

nohup bin/hive --service metastore >> logs/metastore.log 2>&1 &
nohup bin/hive --service hiveserver2 >> logs/hiveserver2.log 2>&1 &

使用jps检查各组件启动情况

查看10000端口号是否被监听

netstat -anp|grep 10000

1.2 软件准备

1.2.1 DBeaver安装(数据库图形化软件,可以更加直观的进行Hive操作)

下载安装后打开

点击编辑驱动设置,删除原有的驱动,换成自己的驱动

确认后进行连接测试

1.2.1.1 DBeaver测试连接失败

1.检查metastore和hiveserver2是否打开,查看10000端口号是否被监听。否,重复1.1步骤

2.打开windows终端,ping linux  ip 地址能否 ping 通。否,解决问题

虚拟机网络配置教程,ping不通的几种原因及解决办法_ping不通虚拟机ip地址的原因-CSDN博客

1.2.2 FineBI安装

【Hadoop】-FineBI的介绍及安装[16]-CSDN博客

2. 案例操作

 目标

2.1 需求分析

1.统计今日总消息量
2.统计今日每小时消息量、发送和接收用户数
3.统计今日各地区发送消息数据量
4.统计今日发送消息和接收消息的用户数
5.统计今日发送消息最多的Top10用户
6.统计今日接收消息最多的Top10用户
7.统计发送人的手机型号分布情况
8.统计发送人的设备操作系统分布情况

使用DBeaver管理

1.建立数据库和表

#如果数据库已存在就删除
drop database if exists db_msg cascade;

#创建数据库
create database db_msg;

#切换数据库
use db_msg;


#如果表已存在就删除
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 "消息内容"
);



将chat_data-30W.csv文件传到Linux中'/home/hadoop/下

#加载数据到表中
load data local inpath '/home/hadoop/chat_data-30W.csv' overwrite into table tb_msg_source;

#验证结果:

select 
    msg_time, sender_name, sender_ip, sender_phonetype, receiver_name, receiver_network 
from tb_msg_source limit 10;

 2.2 ETL数据清洗

  1. 问题1:当前数据中,有一些数据的字段为空,不是合法数据
  2. 问题2:需求中,需要统计每天、每个小时的消息量,但是数据中没有天和小时字段,只有整体时间字段,不好处理
  3. 问题3:需求中,需要对经度和维度构建地区的可视化地图,但是数据中GPS经纬度为一个字段,不好处理
select
	msg_time, sender_name, sender_gps
from db_msg.tb_msg_source 
where length(sender_gps) = 0
limit 10;


select
	msg_time
from db_msg.tb_msg_source
limit 10;


select   
    sender_gps 
from db_msg.tb_msg_source 
limit 10;
  1. 需求1:对字段为空的不合法数据进行过滤(​​​​​​​where过滤)
  2. 需求2:通过时间字段构建天和小时字段(date hour函数)
  3. 需求3:从GPS的经纬度中提取经度和维度(split函数)
  4. 需求4:将ETL以后的结果保存到一张新的Hive
建表
create table db_msg.tb_msg_etl(
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 "消息内容",
msg_day string comment "消息日",
msg_hour string comment "消息小时",
sender_lng double comment "经度",
sender_lat double comment "纬度"
);


实现ETL
INSERT OVERWRITE TABLE db_msg.tb_msg_etl
SELECT 
    *, 
    date(msg_time) as msg_day, 
    HOUR(msg_time) as msg_hour, 
    split(sender_gps, ',')[0] AS sender_lng,
    split(sender_gps, ',')[1] AS sender_lat
FROM tb_msg_source WHERE LENGTH(sender_gps) > 0;


查看结果
select
	msg_time, msg_day, msg_hour, sender_gps, sender_lng, sender_lat 
from db_msg.tb_msg_etl
limit 10;

其实我们刚刚完成了

从表tb_msg_source 查询数据进行数据过滤和转换,并将结果写入到:tb_msg_etl表中的操作

这种操作,本质上是一种简单的ETL行为。

ETL

E Extract ,抽取
T Transform ,转换
L Load ,加载

A抽取数据(E),进行数据转换过滤(T),将结果加载到B(L),就是ETL

2.3 指标计算

1.统计今日总消息量
2.统计今日每小时消息量、发送和接收用户数
3.统计今日各地区发送消息数据量
4.统计今日发送消息和接收消息的用户数
5.统计今日发送消息最多的Top10用户
6.统计今日接收消息最多的Top10用户
7.统计发送人的手机型号分布情况
8.统计发送人的设备操作系统分布情况
指标1:统计今日消息总量

--保存结果表
CREATE TABLE IF NOT EXISTS tb_rs_total_msg_cnt 
COMMENT "每日消息总量" AS 
SELECT 
    msg_day, 
    COUNT(*) AS total_msg_cnt 
FROM db_msg.tb_msg_etl 
GROUP BY msg_day;


指标2:统计每小时消息量、发送和接收用户数

--保存结果表
CREATE TABLE IF NOT EXISTS tb_rs_hour_msg_cnt 
COMMENT "每小时消息量趋势" AS  
SELECT  
    msg_hour, 
    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 msg_hour;


指标3:统计今日各地区发送消息总量

--保存结果表
CREATE TABLE IF NOT EXISTS tb_rs_loc_cnt
COMMENT '今日各地区发送消息总量' AS 
SELECT 
    msg_day,  
    sender_lng, 
    sender_lat, 
    COUNT(*) AS total_msg_cnt 
FROM db_msg.tb_msg_etl
GROUP BY msg_day, sender_lng, sender_lat;


指标4:统计今日发送和接收用户人数

--保存结果表
CREATE TABLE IF NOT EXISTS tb_rs_usr_cnt
COMMENT "今日发送消息人数、接受消息人数" AS
SELECT 
msg_day, 
COUNT(DISTINCT sender_account) AS sender_usr_cnt, 
COUNT(DISTINCT receiver_account) AS receiver_usr_cnt
FROM db_msg.tb_msg_etl
GROUP BY msg_day;


指标5:统计发送消息条数最多的Top10用户

--保存结果表
CREATE TABLE IF NOT EXISTS db_msg.tb_rs_s_user_top10
COMMENT "发送消息条数最多的Top10用户" AS
SELECT 
    sender_name AS username, 
    COUNT(*) AS sender_msg_cnt 
FROM db_msg.tb_msg_etl 
GROUP BY sender_name 
ORDER BY sender_msg_cnt DESC 
LIMIT 10;


指标6:统计接收消息条数最多的Top10用户

--保存结果表
CREATE TABLE IF NOT EXISTS db_msg.tb_rs_r_user_top10
COMMENT "接收消息条数最多的Top10用户" AS
SELECT 
receiver_name AS username, 
COUNT(*) AS receiver_msg_cnt 
FROM db_msg.tb_msg_etl 
GROUP BY receiver_name 
ORDER BY receiver_msg_cnt DESC 
LIMIT 10;


指标7:统计发送人的手机型号分布情况

--保存结果表
CREATE TABLE IF NOT EXISTS db_msg.tb_rs_sender_phone
COMMENT "发送人的手机型号分布" AS
SELECT 
    sender_phonetype, 
    COUNT(sender_account) AS cnt 
FROM db_msg.tb_msg_etl 
GROUP BY sender_phonetype;

指标8:统计发送人的手机操作系统分布

--保存结果表
CREATE TABLE IF NOT EXISTS db_msg.tb_rs_sender_os
COMMENT "发送人的OS分布" AS
SELECT
    sender_os, 
    COUNT(sender_account) AS cnt 
FROM db_msg.tb_msg_etl 
GROUP BY sender_os

2.4 可视化展现

2.4.1 连接Hive

 点击右上角连接测试保存

2.4.2 数据准备

 

点击更新数据

 根据组件自己编辑:

 每个图都是一个组件,选择自己喜欢的可视化样式,最后放入一个仪表盘中

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值