当前位置:   article > 正文

Hive实战(使用30w条聊天数据构建分析报表 ,附加BUG解决)_用java编写的hive的聊天数据分析项目

用java编写的hive的聊天数据分析项目

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

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

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


1. 准备工作

1.1 环境准备

  1. 在各服务器一键启动hadoop组件
  2. start-all.sh
  3. 在hive安装的服务器上,首先启动metastore服务,然后启动hiveserver2服务
  4. (便于后面使用图像化软件管理hive)
  5. 进入hive文件夹下
  6. cd /export/server
  7. 启动metastore和hiveserver2
  8. nohup bin/hive --service metastore >> logs/metastore.log 2>&1 &
  9. 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. 1.统计今日总消息量
  2. 2.统计今日每小时消息量、发送和接收用户数
  3. 3.统计今日各地区发送消息数据量
  4. 4.统计今日发送消息和接收消息的用户数
  5. 5.统计今日发送消息最多的Top10用户
  6. 6.统计今日接收消息最多的Top10用户
  7. 7.统计发送人的手机型号分布情况
  8. 8.统计发送人的设备操作系统分布情况

  1. 使用DBeaver管理
  2. 1.建立数据库和表
  3. #如果数据库已存在就删除
  4. drop database if exists db_msg cascade;
  5. #创建数据库
  6. create database db_msg;
  7. #切换数据库
  8. use db_msg;
  9. #如果表已存在就删除
  10. drop table if exists db_msg.tb_msg_source;
  11. #建表
  12. create table db_msg.tb_msg_source(
  13. msg_time string comment "消息发送时间",
  14. sender_name string comment "发送人昵称",
  15. sender_account string comment "发送人账号",
  16. sender_sex string comment "发送人性别",
  17. sender_ip string comment "发送人ip地址",
  18. sender_os string comment "发送人操作系统",
  19. sender_phonetype string comment "发送人手机型号",
  20. sender_network string comment "发送人网络类型",
  21. sender_gps string comment "发送人的GPS定位",
  22. receiver_name string comment "接收人昵称",
  23. receiver_ip string comment "接收人IP",
  24. receiver_account string comment "接收人账号",
  25. receiver_os string comment "接收人操作系统",
  26. receiver_phonetype string comment "接收人手机型号",
  27. receiver_network string comment "接收人网络类型",
  28. receiver_gps string comment "接收人的GPS定位",
  29. receiver_sex string comment "接收人性别",
  30. msg_type string comment "消息类型",
  31. distance string comment "双方距离",
  32. message string comment "消息内容"
  33. );
  34. 将chat_data-30W.csv文件传到Linux中'/home/hadoop/下
  35. #加载数据到表中
  36. load data local inpath '/home/hadoop/chat_data-30W.csv' overwrite into table tb_msg_source;
  37. #验证结果:
  38. select
  39. msg_time, sender_name, sender_ip, sender_phonetype, receiver_name, receiver_network
  40. from tb_msg_source limit 10;

 2.2 ETL数据清洗

  1. 问题1:当前数据中,有一些数据的字段为空,不是合法数据
  2. 问题2:需求中,需要统计每天、每个小时的消息量,但是数据中没有天和小时字段,只有整体时间字段,不好处理
  3. 问题3:需求中,需要对经度和维度构建地区的可视化地图,但是数据中GPS经纬度为一个字段,不好处理
  1. select
  2. msg_time, sender_name, sender_gps
  3. from db_msg.tb_msg_source
  4. where length(sender_gps) = 0
  5. limit 10;
  6. select
  7. msg_time
  8. from db_msg.tb_msg_source
  9. limit 10;
  10. select
  11. sender_gps
  12. from db_msg.tb_msg_source
  13. limit 10;
  1. 需求1:对字段为空的不合法数据进行过滤(​​​​​​​where过滤)
  2. 需求2:通过时间字段构建天和小时字段(date hour函数)
  3. 需求3:从GPS的经纬度中提取经度和维度(split函数)
  4. 需求4:将ETL以后的结果保存到一张新的Hive
  1. 建表
  2. create table db_msg.tb_msg_etl(
  3. msg_time string comment "消息发送时间",
  4. sender_name string comment "发送人昵称",
  5. sender_account string comment "发送人账号",
  6. sender_sex string comment "发送人性别",
  7. sender_ip string comment "发送人ip地址",
  8. sender_os string comment "发送人操作系统",
  9. sender_phonetype string comment "发送人手机型号",
  10. sender_network string comment "发送人网络类型",
  11. sender_gps string comment "发送人的GPS定位",
  12. receiver_name string comment "接收人昵称",
  13. receiver_ip string comment "接收人IP",
  14. receiver_account string comment "接收人账号",
  15. receiver_os string comment "接收人操作系统",
  16. receiver_phonetype string comment "接收人手机型号",
  17. receiver_network string comment "接收人网络类型",
  18. receiver_gps string comment "接收人的GPS定位",
  19. receiver_sex string comment "接收人性别",
  20. msg_type string comment "消息类型",
  21. distance string comment "双方距离",
  22. message string comment "消息内容",
  23. msg_day string comment "消息日",
  24. msg_hour string comment "消息小时",
  25. sender_lng double comment "经度",
  26. sender_lat double comment "纬度"
  27. );
  28. 实现ETL
  29. INSERT OVERWRITE TABLE db_msg.tb_msg_etl
  30. SELECT
  31. *,
  32. date(msg_time) as msg_day,
  33. HOUR(msg_time) as msg_hour,
  34. split(sender_gps, ',')[0] AS sender_lng,
  35. split(sender_gps, ',')[1] AS sender_lat
  36. FROM tb_msg_source WHERE LENGTH(sender_gps) > 0;
  37. 查看结果
  38. select
  39. msg_time, msg_day, msg_hour, sender_gps, sender_lng, sender_lat
  40. from db_msg.tb_msg_etl
  41. 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. 1.统计今日总消息量
  2. 2.统计今日每小时消息量、发送和接收用户数
  3. 3.统计今日各地区发送消息数据量
  4. 4.统计今日发送消息和接收消息的用户数
  5. 5.统计今日发送消息最多的Top10用户
  6. 6.统计今日接收消息最多的Top10用户
  7. 7.统计发送人的手机型号分布情况
  8. 8.统计发送人的设备操作系统分布情况
  1. 指标1:统计今日消息总量
  2. --保存结果表
  3. CREATE TABLE IF NOT EXISTS tb_rs_total_msg_cnt
  4. COMMENT "每日消息总量" AS
  5. SELECT
  6. msg_day,
  7. COUNT(*) AS total_msg_cnt
  8. FROM db_msg.tb_msg_etl
  9. GROUP BY msg_day;
  10. 指标2:统计每小时消息量、发送和接收用户数
  11. --保存结果表
  12. CREATE TABLE IF NOT EXISTS tb_rs_hour_msg_cnt
  13. COMMENT "每小时消息量趋势" AS
  14. SELECT
  15. msg_hour,
  16. COUNT(*) AS total_msg_cnt,
  17. COUNT(DISTINCT sender_account) AS sender_usr_cnt,
  18. COUNT(DISTINCT receiver_account) AS receiver_usr_cnt
  19. FROM db_msg.tb_msg_etl GROUP BY msg_hour;
  20. 指标3:统计今日各地区发送消息总量
  21. --保存结果表
  22. CREATE TABLE IF NOT EXISTS tb_rs_loc_cnt
  23. COMMENT '今日各地区发送消息总量' AS
  24. SELECT
  25. msg_day,
  26. sender_lng,
  27. sender_lat,
  28. COUNT(*) AS total_msg_cnt
  29. FROM db_msg.tb_msg_etl
  30. GROUP BY msg_day, sender_lng, sender_lat;
  31. 指标4:统计今日发送和接收用户人数
  32. --保存结果表
  33. CREATE TABLE IF NOT EXISTS tb_rs_usr_cnt
  34. COMMENT "今日发送消息人数、接受消息人数" AS
  35. SELECT
  36. msg_day,
  37. COUNT(DISTINCT sender_account) AS sender_usr_cnt,
  38. COUNT(DISTINCT receiver_account) AS receiver_usr_cnt
  39. FROM db_msg.tb_msg_etl
  40. GROUP BY msg_day;
  41. 指标5:统计发送消息条数最多的Top10用户
  42. --保存结果表
  43. CREATE TABLE IF NOT EXISTS db_msg.tb_rs_s_user_top10
  44. COMMENT "发送消息条数最多的Top10用户" AS
  45. SELECT
  46. sender_name AS username,
  47. COUNT(*) AS sender_msg_cnt
  48. FROM db_msg.tb_msg_etl
  49. GROUP BY sender_name
  50. ORDER BY sender_msg_cnt DESC
  51. LIMIT 10;
  52. 指标6:统计接收消息条数最多的Top10用户
  53. --保存结果表
  54. CREATE TABLE IF NOT EXISTS db_msg.tb_rs_r_user_top10
  55. COMMENT "接收消息条数最多的Top10用户" AS
  56. SELECT
  57. receiver_name AS username,
  58. COUNT(*) AS receiver_msg_cnt
  59. FROM db_msg.tb_msg_etl
  60. GROUP BY receiver_name
  61. ORDER BY receiver_msg_cnt DESC
  62. LIMIT 10;
  63. 指标7:统计发送人的手机型号分布情况
  64. --保存结果表
  65. CREATE TABLE IF NOT EXISTS db_msg.tb_rs_sender_phone
  66. COMMENT "发送人的手机型号分布" AS
  67. SELECT
  68. sender_phonetype,
  69. COUNT(sender_account) AS cnt
  70. FROM db_msg.tb_msg_etl
  71. GROUP BY sender_phonetype;
  72. 指标8:统计发送人的手机操作系统分布
  73. --保存结果表
  74. CREATE TABLE IF NOT EXISTS db_msg.tb_rs_sender_os
  75. COMMENT "发送人的OS分布" AS
  76. SELECT
  77. sender_os,
  78. COUNT(sender_account) AS cnt
  79. FROM db_msg.tb_msg_etl
  80. GROUP BY sender_os

2.4 可视化展现

2.4.1 连接Hive

 点击右上角连接测试保存

2.4.2 数据准备

 

点击更新数据

 根据组件自己编辑:

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号