实战大数据项目

news/2024/11/20 13:37:19/

存储日志数据集(HDFS)

数据仓库构建(Hive)

数据分区表构建

数据预处理  (Spark计算引擎)-使用Zeppelin进行写SQL

订单指标分析

Sqoop数据导出到传统数据库(Mysql)

Superset数据可视化

项目架构

架构方案:

1、基于Hadoop的HDFS(数据存储)文件系统来存储数据

2、为了方便进行数据分析,将这些日志文件的数据映射为一张一张的表,所以,我们 基于Hive(数据仓库工具)来构建数据仓库,所有的数据,都会在Hive下进行管理,提高数据处理的性能。

3、基于Spark(计算引擎)来进行数据开发,所有的应用程序都将运行在Spark集群上,这样可以保证数据被高性能的处理。

4、使用Zeppelin(在Zeppelin写SQL效率高,直接在终端写效率低)来快速将数据进行SQL指令交互。

5、使用Sqoop导出分析后的数据到传统型数据库(Mysql),便于后期应用

6、使用Superset(数据可视化工具)来实现数据可视化展示

架构图

 一、数据仓库构建-数仓分层

首先将日志数据上传到HDFS保存下来,每天都可以上传,HDFS可以保存海量的数据,然后使用Hive,将HDFS中的数据文件,对应到Hive的表中。但是一般情况下日志数据是不能够直接进行分析的。所以需要我们对日志文件的原始数据进行预处理,才能进行分析。

我们会有这么几类数据考虑:

1、原始日志数据(业务系统中保存的日志文件数据)

2、预处理后的数据

3、分析结果数据

这些数据都通过Hive进行处理,因为Hive将数据映射为一张张的表,然后可以通过编写SQL来处理数据,简单、快捷、高效,为了区分以上这些数据,我们将这些数据对应的表分别保存在不同的数据库中。

为了方便组织、管理上面的三类数据,我们将数仓分为不同的层,简单来说,就是分别将三类不同的数据保存在Hive的不同数据中。

 第一层临时存储层ODS,就是存储原始日志数据

第二层数据仓库层DW,就是存储预处理后的数据,就是分析的数据

第三层应用层APP。

根据数仓架构的三层,创建三个数据库,分别用来管理每一层的表数据。

-- 创建ods库
create database if not exists ods_d;
-- 创建dw库
create database if not exists dw_d;
-- 创建app库
create database if not exists app_d;

二、数据分区表构建

1)、ods创建用户打车订单表

根据用户打车订单数据,创建按照日期分区的表:

2)、ods创建取消订单表

根据用户取消订单数据,创建按照日期分区的表

3)、ods创建订单表支付表

根据用户订单支付数据,创建按照日期分区的表

4)、ods创建用户评价表

根据用户评价数据,创建按照日期分区的表

5)、基于T+1的日期分区

大规模数据处理,必须要构建分区,每天都会进行分析,采用的是T+1模式。今天数据,第二天才能看到分析结果。

1、创建本地路径,上传日志文件
mkdir -p /export/data/test
2、通过load命令给表加载数据,并指定分区
load data local inpath '/export/data/test/order.csv' into table t_user_order partition(dt='2020-04-12');

三、数据预处理

数据预处理-用户订单处理

数据有了之后,需要对ods层中的数据进行预处理,数据预处理是数据仓库开发中的一个重要环节,主要目的是让预处理的数据更容易进行数据分析,并且能够将一些非法的数据处理掉,避免影响实际的统计结果。

预处理内容:

1、过滤掉order_time长度小于8的数据,如果小于8,表示这条数据不合法,不应该参加统计

2、将一些0,1表示的字段,处理为更容易理解的字段,例如:subscribe字段,0表示非预约,1表示预约,我们需要添加一个额外的字段,用来展示非预约和预约,这样分析的时候,便于看懂数据。

3、order_time字段为2020-4-12 1:15,为了将来更方便处理,统一使用类似2020-04-12 01:15来表示,这样所有的order_time字段长度是一样的,并且将日期获取出来。

4、为了方便将来按照年、月、日,小时统计,我们需要新增这些字段。

5、后续要分析一天内,不同时段的订单量,需要在预处理过程中将订单对应的时间段提前计算出来,例如:1:00-5:00为凌晨。

数据预处理-用户订单处理

1)、一天各个时段对应关系

2)、dw层创建宽表(宽表含义,要比ods层的表字段多)

在进行预处理之前,先把预处理之后保存数据的表创建出来。

3)、建宽表语句

create table if not exists dw_test_user_order_wide

4)、预处理SQL语句

5)、HQL编好后,方便分析,需要将预处理的数据写入到之前创建的宽表中,注意:宽表也是一个分区表,所以,写入的时候要指定对应的分区。

四、订单指标分析-总订单笔数分析

数据处理好后,进行分析

1)、编写HQL语句

-- 计算4月12日总订单笔数
selectcount(orderid) as total_cnt 
fromdw_didi.t_user_order_wide 
where dt = '2020-04-12’;

订单指标分析-总订单笔数分析

2)、app层建表

数据分析后,每次都要处理大规模数据,每次处理都需要占用较长时间,所以,我们可以将计算好的数据,直接保存下来。将来,可以快速查询数据结果,所以需要在app层创建表,保存的数据为某天的总订单数,保存一下几个字段:

1、时间(哪天的订单总数)

2、订单总数

-- 创建保存日期对应订单笔数的app表
create table if not exists app_didi.t_order_total(date string comment '日期(年月日)',count integer comment '订单笔数'
)
partitioned by (month string comment '年月,yyyy-MM')
row format delimited fields terminated by ','
;

3)、加载数据到app层,

此处因为结果的数据不会很多,所以只需要基于年月来分区

insert overwrite table app_didi.t_order_total partition(month='2020-04')
select '2020-04-12',count(orderid) as total_cnt
From  dw_didi.t_user_order_wide
Where   dt = '2020-04-12';

查询的结果,后面就可以做为可视化使用。

订单指标分析-预约订单/非预约订单占比分析

数据处理好后,就可以进行分析了。

1、编写HQL语句

selectsubscribe_name,count(*) as order_cnt
fromdw_didi.t_user_order_wide
wheredt = '2020-04-12'
group bysubscribe_name
;

2、app层建表

包含几个字段:

日期、是否预约、订单数量

create table if not exists app_didi.t_order_subscribe_total(date string comment '日期',subscribe_name string comment '是否预约',count integer comment '订单数量'
)
partitioned by (month string comment '年月,yyyy-MM')
row format delimited fields terminated by ','
;

3、加载数据到app表

insert overwrite table app_didi.t_order_subscribe_total partition(month = '2020-04')
select'2020-04-12',subscribe_name,count(*) as order_cnt
fromdw_didi.t_user_order_wide
wheredt = '2020-04-12'
group bysubscribe_name
;

订单指标分析-不同时段订单占比分析

1)、编写HQL语句

selectorder_time_range,count(*) as order_cnt
fromdw_didi.t_user_order_wide
wheredt = '2020-04-12'
group byorder_time_range
;

2)、app层建表

create table if not exists app_didi.t_order_timerange_total(date string comment '日期',timerange string comment '时间段',count integer comment '订单数量'
)
partitioned by (month string comment '年月,yyyy-MM')
row format delimited fields terminated by ','
;

3)、加载数据到app表

insert overwrite table app_didi.t_order_timerange_total partition(month = '2020-04')
select'2020-04-12',order_time_range,count(*) as order_cnt
fromdw_didi.t_user_order_wide
wheredt = '2020-04-12'
group byorder_time_range
;

订单指标分析-不同地域订单对比

1)、编写HQL语句

selectprovince,count(*) as order_cnt
fromdw_didi.t_user_order_wide
wheredt = '2020-04-12'
group byprovince
;

2)、app层建表

create table if not exists app_didi.t_order_province_total(date string comment '日期',province string comment '省份',count integer comment '订单数量'
)
partitioned by (month string comment '年月,yyyy-MM')
row format delimited fields terminated by ','
;

3)、加载数据到app表

insert overwrite table app_didi.t_order_province_total partition(month = '2020-04')
select'2020-04-12',province,count(*) as order_cnt
fromdw_didi.t_user_order_wide
wheredt = '2020-04-12'
group byprovince
;

订单指标分析-不同年龄段/时段订单占比

1)、编写HQL语句

select age_range, order_time_range, count(*) as order_cnt 
from dw_didi.t_user_order_wide 
where dt = '2020-04-12’ 
group by age_range, order_time_range 
;

2)、app层建表

create table if not exists app_didi. t_order_age_and_time_range_total ( 
date string comment '日期’, 
age_range string comment '年龄段’, 
order_time_range string comment '时段’, 
count integer comment '订单数量’ 
) 
partitioned by (month string comment '年月,yyyy-MM’) 
row format delimited fields terminated by ',' ;

3)、加载数据到app表

insert overwrite table app_didi.t_order_age_and_time_range_total partition(month = '2020-04’) 
select ‘2020-04-12’,age_range, order_time_range, count(*) as order_cnt 
from dw_didi.t_user_order_wide 
where dt = '2020-04-12’ 
group by age_range, order_time_range ;

select * from app_didi.t_order_age_and_time_range_total

五、Sqoop数据导出

在分析完核心指标后,需要将指标数据导出到mysql数据库中,便于后续的应用,例如指标的可视化。

Apache Sqoop是在Hadoop生态体系和RDBMS体系之间传送数据的一个工具,来自于Apache

Hadoop生态系统包含:HDFS、Hive、Hbase等等

RDBMS体系包含:Mysql、Oracle、DB2等

Sqoop可以理解:“SQL到Hadoop 和Hadoop 到SQL”

 安装Sqoop 1.4.7启动

#进入Sqoop安装目录
cd /export/server/sqoop-1.4.7
#验证sqoop是否工作
bin/sqoop list-databases \
--connect jdbc:mysql://192.168.88.100:3306/ \
--username root \
--password 123456

显示Mysql中所有的数据库

information_schema
hive
mysql
performance_schema
sys

Mysql创建目标表

1)、将数据从Hadoop生态体系导出到RDBMS数据库导出前,目标表必须存在于目标数据库中,所以我们必须先在Mysql中创建对应的目标数据库app_test

 #创建目标数据库create database if not exists app_didi;#创建订单总笔数目标表create table if not exists app_didi.t_order_total(order_date date,count int);#创建预约订单/非预约订单统计目标表create table if  not exists app_didi.t_order_subscribe_total(order_date date ,subscribe_name varchar(20) ,count int
); 

2)、在mysql中创建数据库和目标表

 #创建不同时段订单统计目标表
create table if not exists app_didi.t_order_timerange_total(order_date date ,timerange varchar(20) ,count int );#创建不同地域订单统计目标表create table if not exists app_didi.t_order_province_total(order_date date ,province varchar(20) ,count int );#创建不同年龄段,不同时段订单目标表create table if not exists app_didi.t_order_age_and_time_range_total(order_date date ,age_range varchar(20) ,order_time_range varchar(20) ,count int );

Sqoop数据导出

1)、将Hive中的结果表导出到mysql中

 #导出订单总笔数表数据bin/sqoop export \--connect jdbc:mysql://192.168.88.100:3306/app_didi \--username root \--password 123456 \
# 导入到这个mysql中的表--table t_order_total \
#  将HDFS中的表--export-dir /user/hive/warehouse/app_didi.db/t_order_total/month=2020-04#导出预约和非预约订单统计数据bin/sqoop export \--connect jdbc:mysql://192.168.88.100:3306/app_didi \--username root \--password 123456 \
# 导入到这个mysql中的表--table t_order_subscribe_total \
#  将HDFS中的表--export-dir /user/hive/warehouse/app_didi.db/t_order_subscribe_total/month=2020-04

Sqoop导出Hive结果表数据到Mysql

#导出不同时段订单统计表bin/sqoop export \--connect jdbc:mysql://192.168.88.100:3306/app_didi \--username root \--password 123456 \--table t_order_timerange_total \--export-dir /user/hive/warehouse/app_didi.db/t_order_timerange_total/month=2020-04#导出不同地域订单统计表bin/sqoop export \--connect jdbc:mysql://192.168.88.100:3306/app_didi \--username root \--password 123456 \
# 导入到这个mysql中的表--table t_order_province_total  \
#  将HDFS中的表--export-dir /user/hive/warehouse/app_didi.db/t_order_province_total/month=2020-04
#导出不同年龄段,不同时段订单目标表bin/sqoop export \--connect jdbc:mysql://192.168.88.100:3306/app_didi \--username root \--password 123456 \
# 导入到这个mysql中的表--table t_order_age_and_time_range_total  \
#  将HDFS中的表--export-dir /user/hive/warehouse/app_didi.db/t_order_age_and_time_range_total/month=2020-04

六、Suerpset数据可视化

1)、Superset介绍

Superset是一个开源的企业级BI,它是目前开源的数据分析和可视化工具中比较好用的,功能简单,支持多种数据源、图标类型多、易维护、易二次开发。

2)、特点

1、丰富的数据可视化集

2、易于使用的界面,用于浏览和可视化数据

3、可提供身份验证。

Superset安装和启动

启动

superset run -h 192.168.88.100 -p 8099 --with-threads --reload --debugger

Superset建立数据源

1)、介绍

在启动完Superset之后,可以连接Mysql数据库

2)、连接

mysql的url地:mysql+pymysql://root:123456@192.168.88.100/app_didi?charset=utf8

分析指标可视化-订单总笔数可视化

1)、选择表数据源

 

2)、添加表连接

3)、设置表连接相关参数

4)、设置图标参数

 分析指标可视化-DashBoard看板开发

1)、实现步骤

1、创建看板

2、设置看板名字

3、进入看板

4、编辑看板

5、选择自定义看板

6、制作看板

7、调整看板

最终效果


http://www.ppmy.cn/news/40894.html

相关文章

Java设计模式之适配器模式

目录 1、什么是 Java 适配器模式 2、为什么要使用适配器模式 3、适配器模式的应用场景 4、Java代码中使用适配器的例子 1、什么是 Java 适配器模式 Java 适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换为客户端…

闲人闲谈PS之四十——项目售前费用归集

惯例闲话:广东这段时间老是下雨,堪比江浙一带梅雨季节,人的心情也像这天气一样,阴雨绵绵。2023年伊始,确实感觉很多事情在发生剧变,这种变化也稍微影响了闲人那本来稳如老狗的心。面对未知和变化&#xff0…

软考第三章 广域通信网

广域通信网 1.公共交换电话网 公共交换电话网PSTN:是为了话音通信而建立的网络,在有些地方用户仍然通过电话线拨号上网 1.1 电话系统的结构 电话系统是一个高度冗余的分级网络。用户电话通过一对铜线连接到最近的端局。 公共电话网由本地网和长途网组…

ChatGPT批量翻译-ChatGPT批量生成多国语言

ChatGPT翻译的准吗 ChatGPT是一种基于Transformer架构的自然语言处理技术,其翻译准确性取决于所训练的模型和数据集的质量。在特定的语料库和训练数据下,ChatGPT可以实现一定程度的准确翻译。但是,与人工翻译相比,ChatGPT的翻译质…

搭建docker仓库

拉去仓库镜像registry, 当然不拉取也行,运行容器的时候,本地没有镜像会自己拉取 docker pull registry启动服务 docker run -d -p 5000:5000 -v /home/registry:/var/lib/registry --name registry_c registry # 为什么要使用目录挂载,保证…

【华为OD机试真题】积木最远距离(相同数字的积木游戏1)(javapython)

相同数字的积木游戏1 知识点数组循环map 时间限制:1s 空间限制:256MB 限制语言:不限 题目描述: 小华和小薇一起通过玩积木游戏学习数学。 他们有很多积木,每个积木块上都有一个数字,积木块上的数字可能相同。 小华随机拿一些积木挨着排成一排,请小薇找到这排积木中数…

使用fetch()异步请求API数据实现汇率转换器

任务8 https://segmentfault.com/a/1190000038998601 https://chinese.freecodecamp.org/news/how-to-master-async-await-with-this-real-world-example/ 跟随上面的指示,理解异步函数的编写,并且实现这个汇率转换器。 第一步:在工作区初始…