实战大数据项目

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 存储日志数据集(HDFS)数据仓库构建(Hive)数据分区表构建数据预处理 (Spark计算引擎)-使用Zeppelin进行写SQL订单指标分析Sqoop数据导出到传统数据库(Mysql)Superset数据可视化项目架构架构方案:1、基于Hadoop的HDFS(数据存储)文件系统来存储数据2、为了方便进行数据分析,将这些日志文件的数据映射为一张一张的表,所以,我们 基于Hive(数据仓库工具)来构建数据仓库,所有的数据,都会在Hive下进行管理,提高数据处理的性能。

存储日志数据集(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(数据可视化工具)来实现数据可视化展示

架构图
image.png

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

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

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

2、预处理后的数据

3、分析结果数据

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

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

第一层临时存储层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日总订单笔数
select
 count(orderid) as total_cnt 
from
 dw_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语句

select
    subscribe_name,
    count(*) as order_cnt
from
    dw_didi.t_user_order_wide
where
    dt = '2020-04-12'
group by
    subscribe_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
from
    dw_didi.t_user_order_wide
where
    dt = '2020-04-12'
group by
    subscribe_name
;

订单指标分析-不同时段订单占比分析
1)、编写HQL语句

select
    order_time_range,
    count(*) as order_cnt
from
    dw_didi.t_user_order_wide
where
    dt = '2020-04-12'
group by
    order_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
from
    dw_didi.t_user_order_wide
where
    dt = '2020-04-12'
group by
    order_time_range
;

订单指标分析-不同地域订单对比
1)、编写HQL语句

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

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
from
    dw_didi.t_user_order_wide
where
    dt = '2020-04-12'
group by
    province
;

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

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”
image.png

安装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)、选择表数据源
image.png

2)、添加表连接
image.png

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

4)、设置图标参数

image.png

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

1)、实现步骤

1、创建看板

2、设置看板名字

3、进入看板

4、编辑看板

5、选择自定义看板

6、制作看板

7、调整看板

最终效果
image.png

相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
5月前
|
SQL 分布式计算 数据可视化
滴滴出行大数据数仓实战
滴滴出行大数据数仓实战
124 0
滴滴出行大数据数仓实战
|
5月前
|
SQL 分布式计算 大数据
【大数据技术Spark】DStream编程操作讲解实战(图文解释 附源码)
【大数据技术Spark】DStream编程操作讲解实战(图文解释 附源码)
43 0
|
5月前
|
安全 大数据 API
elasticsearch|大数据|elasticsearch的api部分实战操作以及用户和密码的管理
elasticsearch|大数据|elasticsearch的api部分实战操作以及用户和密码的管理
66 0
|
5月前
|
SQL 分布式计算 数据库
【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)
【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)
103 0
|
5月前
|
分布式计算 大数据 Scala
【大数据技术Hadoop+Spark】Spark RDD创建、操作及词频统计、倒排索引实战(超详细 附源码)
【大数据技术Hadoop+Spark】Spark RDD创建、操作及词频统计、倒排索引实战(超详细 附源码)
95 1
|
2天前
|
分布式计算 大数据 BI
MaxCompute产品使用合集之MaxCompute项目的数据是否可以被接入到阿里云的Quick BI中
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
2天前
|
SQL 分布式计算 DataWorks
MaxCompute产品使用合集之要查看MaxCompute Studio中的项目中的计算任务代码,我该怎么操作
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
2天前
|
SQL 分布式计算 DataWorks
MaxCompute产品使用合集之该怎么创建MaxCompute的项目
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
20天前
|
机器学习/深度学习 人工智能 安全
Azure Databricks实战:在云上轻松进行大数据分析与AI开发
【4月更文挑战第8天】Databricks在大数据分析和AI开发中表现出色,简化流程并提高效率。文中列举了三个应用场景:数据湖分析、实时流处理和AI机器学习,并阐述了Databricks的一体化平台、云原生弹性及企业级安全优势。博主认为,Databricks提升了研发效能,无缝集成Azure生态,并具有持续创新潜力,是应对大数据挑战和加速AI创新的理想工具。
46 0
|
3月前
|
分布式计算 大数据 Java
Spark 大数据实战:基于 RDD 的大数据处理分析
Spark 大数据实战:基于 RDD 的大数据处理分析
129 0

热门文章

最新文章