基于Spark的企业订单数据分析

简介: 基于Spark的企业订单数据分析

1. 实验室名称:

大数据实验教学系统

2. 实验项目名称:

案例:企业订单数据分析

一、业务场景

现有某公司销售数据集,包含orders、order details和products数据。其中:830个orders和2,155个order details。现公司领导提出,希望大数据分析部门通过分析该销售数据集,回答以下问题:

• 每个客户下了多少订单?

• 每个国家的订单有多少?

• 每月(年)有多少订单?

• 每个客户的年销售总额是多少?

• 客户每年的平均订单是多少?

二、数据集说明

本案例用到的数据集说明如下:

订单数据集文件:/data/dataset/nw/NW-Orders-01.csv  订单详情数据集文件:/data/dataset/nw/NW-Order-Details.csv

  其中,NW-Orders-01.csv数据集包含订单信息,其中部分字段的说明如下:

字段 定义
OrderID 订单ID
CustomerID 客户ID
EmployeeID 员工ID
OrderDate 下单日期
ShipCountry 收货国家

其中,NW-Order-Details.csv数据集包含订单详细信息,其中部分字段的说明如下:

字段 定义
OrderID 订单ID
ProductID 产品ID
UnitPrice 商品单价
Qty 商品数量
Discount 折扣

三、操作步骤

阶段一、启动HDFS、Spark集群服务和zeppelin服务器

1、启动HDFS、Spark集群和Zeppelin服务器

  在Linux终端窗口下,输入以下命令,启动HDFS集群、Spark集群和zeppelin服务器:

1.  $ start-dfs.sh
2.  $ cd /opt/spark
3.  $ ./sbin/start-all.sh
4.  $ zeppelin-daemon.sh start

2、验证以上进程是否已启动

  在Linux终端窗口下,输入以下命令,查看启动的服务进程:

1.  $ jps

如果显示以下6个进程,则说明各项服务启动正常,可以继续下一阶段。

1.  2288 NameNode
2.  2402 DataNode
3.  2603 SecondaryNameNode
4.  2769 Master
5.  2891 Worker
6.  2984 ZeppelinServer

阶段二、准备案例中用到的数据集

1、将本案例要用到的数据集上传到HDFS文件系统的”/data/dataset/“目录下。在Linux终端窗口下,输入以下命令:

1.  $ hdfs dfs -mkdir -p /data/dataset
2.  $ hdfs dfs -put /data/dataset/nw /data/dataset/

2、在Linux终端窗口下,输入以下命令,查看HDFS上是否已经上传了该数据集:

1.  $ hdfs dfs -ls /data/dataset/nw

这时应该看到数据集文件已经上传到了HDFS的”/data/dataset/“目录下。

阶段三、对数据集进行探索和分析

1、新建一个zeppelin notebook文件,并命名为nw_project。

  2、加载数据集到RDD。在notebook单元格中,输入以下代码,加载数据集到RDD:

1.  // 定义要加载数据集的HDFS路径
2.  val filePath = "/data/dataset/nw/"

同时按下【Shift+Enter】键,执行以上代码。

3、加载订单数据到DataFrame中,进行简单探索,并输出其Schema。在notebook单元格中,输入以下代码:

1.  // 订单数据
2.  val orders = spark.read.option("header","true").
3.                          option("inferSchema","true").
4.                          csv(filePath + "NW-Orders-01.csv")
5.  println("订单有" + orders.count() + "个")

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:

orders: org.apache.spark.sql.DataFrame = [OrderID: int, CustomerID: string … 3 more fields]
订单有830个

简单探索,并输出其Schema。在notebook单元格中,输入以下代码:

1.  orders.show(5)
2.  orders.printSchema()

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:


b28032e961c740fead1f7fd36ee76f52.png

4、加载订单详情数据到DataFrame中,进行简单探索,并输出其Schema。在notebook单元格中,输入以下代码:

1.  // 订单详细信息
2.  val orderDetails = spark.read.option("header","true").
3.                                option("inferSchema","true").
4.                                csv(filePath + "NW-Order-Details.csv")
5.  println("订单明细有" + orderDetails.count() + "个")


同时按下【Shift+Enter】键,执行以上代码,输出内容如下:

orderDetails: org.apache.spark.sql.DataFrame = [OrderID: int, ProductId: int … 3 more fields]
订单明细有2155个

简单探索,并输出其Schema。在notebook单元格中,输入以下代码:

1.  orderDetails.show(5)
2.  orderDetails.printSchema()

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:


3a7917a712b94896b4f4cae87bfc9bed.png

5、回答以下问题:每个客户下了多少订单?在notebook单元格中,输入以下代码:

1.  val orderByCustomer = orders.groupBy("CustomerID").count()
2.  orderByCustomer.sort(orderByCustomer("count").desc).show(5)

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:



99d98718de574c80ae9084d05cb7fc12.png


在上面的输出中,我们按订单数量由高到低顺序输出。


6、回答以下问题:来自不同国家的订单各有多少。在notebook单元格中,输入以下代码:

1.  val orderByCountry = orders.groupBy("ShipCountry").count()
2.  orderByCountry.sort($"count".desc).show(5)

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:

83fdc652011046949c56e6a2d28c93af.png


由以上输出内容可以看出,订单最多的国家是德国和美国。


7、对于后面三个问题,需要对数据进行一些转换:

 - 向Orders DataFrame增加一个OrderTotal列:

  - 计算每个订单明细的实际金额

  - 根据order id统计每张订单的总金额

  - 对order details & orders进行等值内连接,增加订单总金额

  - 检查是否有任何null列

 - 增加一个date列

 - 增加month和year


8、向order details中增加每行的小计(每个订单明细的实际金额)。在notebook单元格中,输入以下代码:


1.  val orderDetails1 = orderDetails.select($"OrderID",(($"UnitPrice" * $"Qty") - ($"UnitPrice" * $"Qty") * $"Discount").as("OrderPrice"))
2.       
3.  orderDetails1.show(5)

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:


1127f1e012e8482084012fd68a8f1850.png

由以上输出内容可以看出,订单最多的国家是德国和美国。


9、根据order id统计每张订单的总金额。在notebook单元格中,输入以下代码:

1.  val orderTot = orderDetails1.groupBy("OrderID")
2.                              .agg(sum("OrderPrice").as("OrderTotal"))
3.       
4.  orderTot.select($"OrderID",bround($"OrderTotal",2))
5.          .sort("OrderID")
6.          .show(5)

同时按下【Shift+Enter】键,执行以上代码,,输出内容如下:


404d75bfdac74e42928ff9d061508216.png

10、对order details & orders进行等值内连接,增加订单总金额。在notebook单元格中,输入以下代码:

1.  val orders1 = orders.join(orderTot, orders("OrderID").equalTo(orderTot("OrderID")), "inner").
2.                       select(orders("OrderID"),
3.                              orders("CustomerID"),
4.                              orders("OrderDate"),
5.                              orders("ShipCountry").alias("ShipCountry"),
6.                              bround(orderTot("OrderTotal"),2).alias("Total")
7.                             )
8.       
9.  orders1.sort($"Total".desc).show()

同时按下【Shift+Enter】键,执行以上代码,,输出内容如下:


47a81f50cce04db6878b5fbe4e5b1447.png

11、增加一个date列。在notebook单元格中,输入以下代码:

1.  val orders2 = orders1.withColumn("Date",to_date(orders1("OrderDate")))
2.       
3.  orders2.show(2)
4.  orders2.printSchema()

同时按下【Shift+Enter】键,执行以上代码,,输出内容如下:

dcdf2a08d1fd400192965b6507601567.png


dcdf2a08d1fd400192965b6507601567.png


12、增加month列和year列。在notebook单元格中,输入以下代码:

1.  val orders3 = orders2.withColumn("Month",month($"OrderDate"))
2.                       .withColumn("Year",year($"OrderDate"))
3.       
4.  orders3.show(2)

同时按下【Shift+Enter】键,执行以上代码,,输出内容如下:

f6ef07ab94794248857f4d89255b28f4.png


13、回答以下问题:每月/年有多少订单?在notebook单元格中,输入以下代码:


1.  val ordersByYM = orders3.groupBy("Year","Month")
2.                          .agg(sum("Total").as("Total"))
3.       
4.  ordersByYM.select($"Year",$"Month",bround($"Total",2) as "Total")
5.            .sort($"Year",$"Month")
6.            .show()

同时按下【Shift+Enter】键,执行以上代码,,输出内容如下:


a3ac624e346241f08a61931e17a9aa54.png

13、回答以下问题:每个客户的年销售总额是多少?在notebook单元格中,输入以下代码:

1.  var ordersByCY = orders3.groupBy("CustomerID","Year")
2.                          .agg(sum("Total").as("Total"))
3.       
4.  ordersByCY.sort($"CustomerID",$"Year").show()

同时按下【Shift+Enter】键,执行以上代码,,输出内容如下:

2b6e957dbd7245fa99990e4ff3c3f9fc.png


14、回答以下问题:客户每年的平均订单是多少?在notebook单元格中,输入以下代码:

1.  ordersByCY = orders3.groupBy("CustomerID","Year")
2.                      .agg(avg("Total").as("Avg"))
3.       
4.  ordersByCY.select($"CustomerID",$"Year",bround($"Avg",2))
5.            .sort($"CustomerID",$"Year")
6.            .show()

同时按下【Shift+Enter】键,执行以上代码,,输出内容如下:

fe85ac3bba304803ae9f01681576e4aa.png


15、回答以下问题:客户的平均订单是多少?在notebook单元格中,输入以下代码:


1.  val ordersCA = orders3.groupBy("CustomerID")
2.                        .agg(avg("Total").as("C-Avg"))
3.       
4.  ordersCA.sort(col("C-Avg").desc).show()

同时按下【Shift+Enter】键,执行以上代码,,输出内容如下:

f67b9c66f33c401ca33045d21bf65475.png


阶段四、自行练习

1、使用本案例的数据集,查询指定客户每年的销售额,并可视化呈现结果。


d5edf9e4ab874db59e90b80b7be1e8bb.png

ae8f7746c21440429636fa346e9ad793.png

219b8cf5dcfa45678740f3e4126ed7fb.png


相关文章
|
14天前
|
监控 供应链 数据可视化
运营数据分析在企业管理中的重要性
本文详述了构建高效营销策略体系的方法,涵盖市场调研、产品定位、差异化策略、品牌建设及数据分析等环节,强调了数据可视化工具在策略执行中的重要作用,旨在帮助企业提升市场竞争力和盈利能力。
|
19天前
|
监控 数据可视化 数据挖掘
数据看板制作工具评测:这6款工具能如何提升企业的数据分析效率?
本文介绍了6款数据看板制作工具,包括板栗看板、Tableau、Power BI、Qlik Sense、Google Data Studio和Looker,从功能、适用场景等方面进行了详细对比,旨在帮助企业选择最合适的工具以实现高效的数据可视化和管理决策。
|
2月前
|
设计模式 数据采集 分布式计算
企业spark案例 —出租车轨迹分析
企业spark案例 —出租车轨迹分析
106 0
|
4月前
|
供应链 数据可视化 数据挖掘
【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题一
本文详细介绍了第十一届泰迪杯数据挖掘挑战赛B题的解决方案,涵盖了对产品订单数据的深入分析、多种因素对需求量影响的探讨,并建立了数学模型进行未来需求量的预测,同时提供了Python代码实现和结果可视化的方法。
143 3
【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题一
|
4月前
|
存储 数据可视化 数据挖掘
【python】python企业财务能力数据分析可视化(源码+报告+数据集)【独一无二】
【python】python企业财务能力数据分析可视化(源码+报告+数据集)【独一无二】
263 1
|
4月前
|
数据采集 存储 数据可视化
【python】python超市销售订单数据分析可视化(源码+数据集)【独一无二】
【python】python超市销售订单数据分析可视化(源码+数据集)【独一无二】
167 1
|
4月前
|
机器学习/深度学习 数据采集 数据挖掘
【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题二
本文提供了第十一届泰迪杯数据挖掘挑战赛B题问题二的详细解题步骤,包括时间序列预测模型的建立、多元输入时间预测问题的分析、时间序列预测的建模步骤、改进模型的方法,以及使用Python进行SARIMA模型拟合和预测的具体实现过程。
105 1
|
4月前
|
供应链 算法 数据挖掘
【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 23页论文及实现代码
本文介绍了2023年第十一届泰迪杯数据挖掘挑战赛B题的解决方案,深入分析了产品订单数据,并使用Arimax和Var模型进行了需求预测,旨在为企业供应链管理提供科学依据,论文共23页并包含实现代码。
141 0
【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 23页论文及实现代码
|
6月前
|
分布式计算 数据挖掘 数据处理
Spark如何支持实时数据分析?
【6月更文挑战第16天】Spark如何支持实时数据分析?
87 3
|
7月前
|
SQL 分布式计算 数据挖掘
Spark_Day07:Spark SQL(DataFrame是什么和数据分析(案例讲解))
Spark_Day07:Spark SQL(DataFrame是什么和数据分析(案例讲解))
178 0