Hive项目实战

一、需求分析

1.1. 背景介绍

在线社交平台每天都会有大量的用线,会出现大量数据,通过对数据的统计,可以好的对用构建精准的,为用户提供好的服务以及实现 ROI 平台运营广展决提供的数据支后续基于一个社交平台 App 的用数据,完成相关指标的统计并结合 BI 工具对指标行可

1.2.目标

基于 Hadoop Hive 实现数据统计,构建数据分报表

1.3.需求

  • 统计
  • 统计每小和接
  • 统计息数据
  • 统计日发息和接收消息的
  • 统计多的 Top10
  • 统计收消多的 Top10
  • 统计发手机
  • 统计发设备操作系

1.4.数据内容

  • 数据大小: 30 万条数据
  • 列分隔符: Hive 默认分隔符’ \001’

1.5.建库建表导入数据

  • 创建数据库
-- 如果数据库已存在就删除
drop database if exists db_msg cascade ;

-- 创建数据库
create database db_msg ;

-- 切换数据库
use db_msg ;

-- 列举数据库
show databases ;
  • 创建数据表
-- 如果表已存在就删除
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 " 消息内容 "
);

导入数据

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;

如下:

列分隔符:Hive默认分隔符\001’数据字例数据

二、ETL 数据清洗

2.1.数据问题

问题 1 :当前数据中,有一些数据的字段为空,不是合法数据

select msg_time,sender_name,sender_gps from db_msg.tb_msg_source where length(sender_gps) = 0 limit 10

问题 2 :需求中,需要统计每天、每个小时的消息量,但是数据中没有天和小时字段,只有整体时间字段,不好处理

SELECT msg_time FROM tb_msg_source limit 10;

问题 3 :需求中,需要对经度和维度构建地区的可视化地图,但是数据中 GPS 经纬度为一个字段,不好处理

SELECT sender_gps FROM tb_msg_source limit 10;

2.2.需求分析

  • 需求 1 :对字段为空的不合法数据进行过滤
    • where 过滤
  • 需求 2 :通过时间字段构建天和小时字段
    • date hour 函数
  • 需求 3 :从 GPS 的经纬度中提取经度和维度
    • split 函数
  • 需求 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_data string comment " 消息日 ",
    msg_hour string comment " 消息小时 ",
    sender_lng double comment " 经度 ",
    sender_lat double comment " 纬度 "
);

2.3.实现数据清洗

数据清洗,导入到新创建的表中

INSERT OVERWRITE TABLE db_msg.tb_msg_etl
SELECT
    *,
    to_date(msg_time) as msg_data,
    HOUR(msg_time) as msg_hour,
    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;

查看结果

SELECT 
    msg_time,msg_data,msg_hour,sender_gps,sender_lng,sender_lat
FROM db_msg.tb_msg_etl

2.4. ETL说明

上面完成了从表 tb_msg_source 查询数据进行数据过滤和转换,并将结果写入到: tb_msg_etl 表中的操作,这种操作本质上是一种简单的 ETL 行为。ETL :

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

从 A 抽取数据 (E) ,进行数据转换过滤 (T) ,将结果加载到 B(L) ,就是 ETL ,ETL 在大数据系统数据清洗是非常常见的。

三、指标计算

⑴.指标1 :统计今日消息总量

CREATE TABLE IF NOT EXISTS db_msg.tb_rs_total_msg_cnt COMMENT '每日消息总量' AS
SELECT msg_data,COUNT(*) AS total_msg_cnt FROM db_msg.tb_msg_etl GROUP BY msg_data; 

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

-- CAST(msg_hour as int) AS msg_number_hour 将小时转换为数字,方便排序。排序则是为了后续可视化连续月份显示
CREATE TABLE IF NOT EXISTS db_msg.tb_rs_hour_msg_cnt COMMENT "每小时消息量趋势" AS
SELECT
    CAST(msg_hour as int) AS msg_number_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
ORDER BY msg_number_hour ASC; 

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

CREATE TABLE IF NOT EXISTS db_msg.tb_loc_cnt COMMENT '今日各地区发送消息总量' AS
SELECT 
    msg_data,
    sender_lng,
    sender_lat,
    COUNT(*) AS total_msg_cnt
FROM db_msg.tb_msg_etl
GROUP BY msg_data,sender_lng,sender_lat

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

CREATE TABLE IF NOT EXISTS db_msg.tb_rs_usr_cnt COMMENT '今日发送消息人数、接收消息人数' AS
SELECT 
    msg_data,
    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_data

⑸.指标 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 '发送人的手机操作系统分布' AS
SELECT 
    sender_os,
    COUNT(sender_account) AS cnt 
FROM db_msg.tb_msg_etl
GROUP BY sender_os

四、可视化展现

4.1.PowerBI连接Hive

⑴.由于目前PowerBI没有直接链接HIVE数据库的工具,在连接ClouderaHadoop大数据集群前,需要确保已经安装了最新的驱动程序。按照以下的步骤,安装对应的驱动程序,首先到Cloudera的官方网站下载对应的驱动,网站地址为:https://www.cloudera.com/downloads/connectors/hive/odbc/2-7-0.html,选择Hive的下载连接

⑵.双击运行下载的“ClouderaHiveODBC64.msi”安装程序,安装过程比较简单,默认设置即可

⑶.然后在电脑“ODBC数据源(64位)”中的“系统DSN”下,如果有“SampleClouderaHiveDSN”,说明安装过程没有问题。下面我们将检查一下,是否可以正常连接ClouderaHive集群,前提是连接前需要正常启动集群,如图所示,点击“Test”按钮,如果测试结果出现“SUCCESS!”,说明正常连接

⑷.在power bi在获取数据中,点击更多。选择ODBC

⑸.数据源选择刚才配置好的hive数据库

⑹.在弹出对话框中,数据库选项卡中输入用户名和密码(我的账户没有设置密码,密码为空即可),点击连接即可

⑺.选择加载需要的表数据

4.2.PowerBI中

posted @ 2019-10-29 12:30  酒剑仙*  阅读(1297)  评论(0编辑  收藏  举报