Spark大数据分析实战-公司销售数据分析
文章目录
- 需求
- 一、数据字段说明
- 1.1 日期数据
- 1.2 订单头数据
- 1.3 订单明细数据
- 二、分析步骤
- 2.1 计算所有订单中每年的销售单数、销售总额。
- 2.2 计算所有订单中每年的最大金额订单的销售额。
- 2.3 计算所有订单中每年最畅销的货品。
- 2.4 全部代码
- 三、总结
需求
假设某公司为你提供以下数据,改数据包括3个.txt文档数据,分别为日期数据、订单头数据、订单明细数据。让你根据公司所提供的的数据进行如下的需求分析。
1.计算所有订单中每年的销售单数、销售总额。
2.计算所有订单每年最大金额订单的销售额。
3.计算所有订单中每年最畅销的货品。
一、数据字段说明
1.1 日期数据
字段分别对应:日期、年月、年、月、日、周几、第几周、季度、旬、半月。
1.2 订单头数据
字段分别对应:订单号、交易位置、交易日期。
1.3 订单明细数据
字段分别对应:订单号、行号、货品、数量、单价、总额。
二、分析步骤
2.1 计算所有订单中每年的销售单数、销售总额。
思路:读取数据为df格式,注册临时表,进行三表的join操作进行查询。
代码:
/*** 计算所有订单中每年的销售单数,销售总额* @param session*/def calculate_salesCountByYear_salesMoneyByYear(session:SparkSession)={//日期数据读取为dfval frame_date = session.read.format("csv").option("header", true).load(tbDatePath)//订单头数据读取为dfval frame_stock = session.read.format("csv").option("header", true).load(toStockPath)//订单明细数据读取为dfval frame_detail = session.read.format("csv").option("header", true).load(toStockDetailPath)//分别创建临时表frame_date.createOrReplaceTempView("date");frame_stock.createOrReplaceTempView("stock")frame_detail.createOrReplaceTempView("detail")//执行分析 三个表join查询信息session.sql("select sum(de.Qty) as sales_count," +"sum(de.Amount) as sales_amount," +"substring(da.Dateid,1,4) as date_Time " +"from stock as st " +"inner join detail as de " +"on st.Ordernumber=de.Ordernumber " +"inner join date as da " +"on st.Dateid=da.Dateid " +"group by substring(da.Dateid,1,4)").show()}
结果:
2.2 计算所有订单中每年的最大金额订单的销售额。
思路:首先求出每份订单的销售额以及其发生时间,然后以其结果和日期数据进行表join,求得每年最大金额的订单的销售额。
代码:
/*** 计算所有订单每年最大金额订单的销售额* @param session*/def salesMoneyOfMaxByYear(session:SparkSession)={//分别读取数据文件转为dfval frame_date = session.read.format("csv").option("header", true).load(tbDatePath)val frame_stock = session.read.format("csv").option("header", true).load(toStockPath)val frame_detail = session.read.format("csv").option("header", true).load(toStockDetailPath)//分别创建需要用到的临时表frame_date.createOrReplaceTempView("date");frame_stock.createOrReplaceTempView("stock")frame_detail.createOrReplaceTempView("detail")//先求出每份订单的销售额以及其对应的时间val money_date = session.sql("select (de.Qty*de.Price) as sales_money,da.Dateid " +"from stock as st " +"inner join detail as de " +"on st.Ordernumber=de.Ordernumber " +"inner join date as da " +"on st.Dateid=da.Dateid")//注册为临时表money_date.createOrReplaceTempView("money_date")//将上一步分析的结果与日期数据进行表连接,从而求出每年最大金额订单的销售额session.sql("select max(md.sales_money) as max_money," +"substring(da.Dateid,1,4) as year " +"from money_date as md " +"inner join date as da " +"on md.Dateid=da.Dateid " +"group by substring(da.Dateid,1,4) order by year").show()}
结果:
2.3 计算所有订单中每年最畅销的货品。
思路:首先求出每年每个货品的销售金额,然后求出每年单品销售的最大金额,最后进行表连接求得每年与销售额最大相符的货品就是最畅销的货品。
代码:
/*** 计算所有订单中每年最畅销的货品* @param session*/def popular_product(session:SparkSession)={val frame_date = session.read.format("csv").option("header", true).load(tbDatePath)val frame_stock = session.read.format("csv").option("header", true).load(toStockPath)val frame_detail = session.read.format("csv").option("header", true).load(toStockDetailPath)frame_date.createOrReplaceTempView("date");frame_stock.createOrReplaceTempView("stock")frame_detail.createOrReplaceTempView("detail")//求每年每个货品的销售金额val year_product_money_per = session.sql("select substring(da.Dateid,1,4) as year," +"de.Itemid as product," +"(de.Qty*de.Price) as money " +"from stock as st " +"inner join detail as de " +"on st.Ordernumber=de.Ordernumber " +"inner join date as da " +"on st.Dateid=da.Dateid")//求每年单品销售的最大金额val year_money_max = session.sql("select substring(da.Dateid,1,4) as year," +"max(de.Qty*de.Price) as max_money " +"from stock as st " +"inner join detail as de " +"on st.Ordernumber=de.Ordernumber " +"inner join date as da " +"on st.Dateid=da.Dateid " +"group by year")year_product_money_per.createOrReplaceTempView("year_product_money_per")year_money_max.createOrReplaceTempView("year_money_max")//表连接求得最畅销货品session.sql("select ypmp.year,ypmp.product " +"from year_product_money_per as ypmp " +"inner join year_money_max as ymm " +"on ypmp.year=ymm.year " +"where ypmp.money=ymm.max_money " +"order by ypmp.year").show()}
结果:
2.4 全部代码
代码:
package training.sectionCimport org.apache.spark.sql.{DataFrame, SparkSession}
import org.apache.spark.{SparkConf, SparkContext}/*** @ClassName:company_data_analyse* @author:Architect_王伯文* @date: 2021/10/6 12:01*/
object company_data_analyse {val tbDatePath="日期数据的路径"val toStockPath="订单头数据路径"val toStockDetailPath="订单明细数据 路径 "//定义数据写入数据库的方法def mysql_Position(frame:DataFrame, tbName:String)={frame.write.format("jdbc").option("url","jdbc:mysql://IP地址:3306/数据库名").option("user","用户名").option("password","密码").option("dbtable",tbName).save()}//执行数据写入数据库def moveToMysql(session:SparkSession)={val frame_date = session.read.format("csv").option("header", true).load(tbDatePath)val frame_stock = session.read.format("csv").option("header", true).load(toStockPath)val frame_detail = session.read.format("csv").option("header", true).load(toStockDetailPath)mysql_Position(frame_date,"date")mysql_Position(frame_stock,"stock")mysql_Position(frame_detail,"stockDetail")}/*** 计算所有订单中每年的销售单数,销售总额* @param session*/def calculate_salesCountByYear_salesMoneyByYear(session:SparkSession)={val frame_date = session.read.format("csv").option("header", true).load(tbDatePath)val frame_stock = session.read.format("csv").option("header", true).load(toStockPath)val frame_detail = session.read.format("csv").option("header", true).load(toStockDetailPath)frame_date.createOrReplaceTempView("date");frame_stock.createOrReplaceTempView("stock")frame_detail.createOrReplaceTempView("detail")session.sql("select sum(de.Qty) as sales_count," +"sum(de.Amount) as sales_amount," +"substring(da.Dateid,1,4) as date_Time " +"from stock as st " +"inner join detail as de " +"on st.Ordernumber=de.Ordernumber " +"inner join date as da " +"on st.Dateid=da.Dateid " +"group by substring(da.Dateid,1,4)").show()}/*** 计算所有订单每年最大金额订单的销售额* @param session*/def salesMoneyOfMaxByYear(session:SparkSession)={//分别读取数据文件转为dfval frame_date = session.read.format("csv").option("header", true).load(tbDatePath)val frame_stock = session.read.format("csv").option("header", true).load(toStockPath)val frame_detail = session.read.format("csv").option("header", true).load(toStockDetailPath)//分别创建需要用到的临时表frame_date.createOrReplaceTempView("date");frame_stock.createOrReplaceTempView("stock")frame_detail.createOrReplaceTempView("detail")//先求出每份订单的销售额以及其对应的时间val money_date = session.sql("select (de.Qty*de.Price) as sales_money,da.Dateid " +"from stock as st " +"inner join detail as de " +"on st.Ordernumber=de.Ordernumber " +"inner join date as da " +"on st.Dateid=da.Dateid")//注册为临时表money_date.createOrReplaceTempView("money_date")//将上一步分析的结果与日期数据进行表连接,从而求出每年最大金额订单的销售额session.sql("select max(md.sales_money) as max_money," +"substring(da.Dateid,1,4) as year " +"from money_date as md " +"inner join date as da " +"on md.Dateid=da.Dateid " +"group by substring(da.Dateid,1,4) order by year").show()}/*** 计算所有订单中每年最畅销的货品* @param session*/def popular_product(session:SparkSession)={val frame_date = session.read.format("csv").option("header", true).load(tbDatePath)val frame_stock = session.read.format("csv").option("header", true).load(toStockPath)val frame_detail = session.read.format("csv").option("header", true).load(toStockDetailPath)frame_date.createOrReplaceTempView("date");frame_stock.createOrReplaceTempView("stock")frame_detail.createOrReplaceTempView("detail")val year_product_money_per = session.sql("select substring(da.Dateid,1,4) as year," +"de.Itemid as product," +"(de.Qty*de.Price) as money " +"from stock as st " +"inner join detail as de " +"on st.Ordernumber=de.Ordernumber " +"inner join date as da " +"on st.Dateid=da.Dateid")val year_money_max = session.sql("select substring(da.Dateid,1,4) as year," +"max(de.Qty*de.Price) as max_money " +"from stock as st " +"inner join detail as de " +"on st.Ordernumber=de.Ordernumber " +"inner join date as da " +"on st.Dateid=da.Dateid " +"group by year")year_product_money_per.createOrReplaceTempView("year_product_money_per")year_money_max.createOrReplaceTempView("year_money_max")session.sql("select ypmp.year,ypmp.product " +"from year_product_money_per as ypmp " +"inner join year_money_max as ymm " +"on ypmp.year=ymm.year " +"where ypmp.money=ymm.max_money " +"order by ypmp.year").show()}def main(args: Array[String]): Unit = {val session = SparkSession.builder().master("local[*]").appName("company").getOrCreate()calculate_salesCountByYear_salesMoneyByYear(session)salesMoneyOfMaxByYear(session)popular_product(session)moveToMysql(session)session.stop()}
}
三、总结
以上就是我对公司销售数据的处理和分析过程,我们面对实际的需求时,的确在不熟悉业务的情况下,问题会很棘手,我的建议是要先熟悉业务,想好你要做的事情是什么,接下来在考虑好内容的划分和部分与部分之间的关系。作为一名大数据开发者来说,代码就像写字,人人都会 ,但是程序功能就像是一篇优美的文章。只要熟悉业务,我相信一切问题都可以迎刃而解!加油!
Spark大数据分析实战-公司销售数据分析相关推荐
- 数据分析实战 - 超市销售数据分析,csv输入输出(附带样本集)
导语:给你这样一份数据,来自收银台记账数据,你能提取什么信息?有多大价值?找出这样的信息需要多久时间? 如果使用自动化工具,几十行python代码,能做什么? 首先,导入数据集: import pan ...
- 2013年中国30大IC设计公司销售排名
2013年中国30大IC设计公司销售排名 (百万美元) 排名 企业名称 2013年收入(百万美元) 1 深圳市海思半导体有限公司 2100 2 展讯通信有限公司 1050 3 大唐半导体设计有限公司 ...
- 重点客户销售数据分析python_药品销售数据分析--python
一.数据分析的目的 数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程. 本篇文章中,假设以朝阳医院2018年销售数据为例,目的是了 ...
- Python数据分析实战 —— 天猫订单数据分析
文章目录 项目介绍 数据介绍 导入部分库 数据预处理 数据格式整理 异常值分析 数据分析 描述性统计 周趋势.日趋势分析 产品价格分析 地区分析 转化率分析 总结 项目介绍 本项目将对2020年2月份 ...
- python医药数据分析_药品销售数据分析--python
一.数据分析的目的 数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程. 本篇文章中,假设以朝阳医院2018年销售数据为例,目的是了 ...
- Tableua数据大屏——优衣库城市销售数据分析看板
数据来源于B站戴师兄
- python数据分析实战案例-Python数据分析案例实战
原标题:Python数据分析案例实战 至今我们网站已经开设了多个数据分析系列的课程,大部分都是基于算法思路来开展的,课程中着重点在于算法的讲授.软件的使用,案例只是辅助学习.然而很多学员反映,希望可以 ...
- 每日分享,一个不错的数据分析实战案例【数据分析可视化】MySQL+Python
大家早上好,本人姓吴,如果觉得文章写得还行的话也可以叫我吴老师.欢迎大家跟我一起走进数据分析的世界,一起学习! 感兴趣的朋友可以关注我或者我的数据分析专栏,里面有许多优质的文章跟大家分享哦. 目录 项 ...
- python数据分析实战基础_Python数据分析实战基础(二):清洗常用4板斧
作者 | 吹牛Z来源 | 数据不吹牛 首先,导入案例数据集.因为案例数据存放在同一个Excel表的不同Sheet下,我们需要指定sheetname分别读取: 下面开始清洗的正餐. 01 增--拓展数据 ...
最新文章
- py编程技巧-1.5-如何快速找到多个字典的公共键(key)
- 黑白青春-纪念那年我的秋天
- 全国大学生智能汽车竞赛证书打印方法
- Android View之间的触摸事件传递图
- C语言入门题-7-1 最大和最小 (10分)
- 前大灯是近光灯还是远光灯_汽修案例:长安福特翼博前大灯间歇自动点亮
- java中list里面存放map,根据map中的某一个字段进行排序
- 读书日当天冲上销量榜Top1和Top3,来听听携程人写书背后的故事
- oracle 9i,10G,11G,各版本下载资源(使用迅雷),收集好久,分享上来!
- svn 分支上新增文件合并发生冲突_SVN使用:分支合并及解决冲突详解
- 百度蜘蛛ip地址大全,百度搜索引擎蜘蛛的IP地址段
- Java程序的方法设计
- 地球经纬度计算两点距离
- JQuery中常用的 属性选择器
- Matlab多元非线性函数拟合
- 解读图书管理系统为书店带来的好处
- Redis不同数据类型的查询命令语句
- 微博URL短地址lua生成算法
- IT男人必学的20大泡妞妙招(请允许我蛋疼的转一下)
- 围堵Zoom, 谷歌救得了自己,还是能终结在线办公乱局?
热门文章
- 【精讲】vue2框架 路由的使用入门
- VS Code 扩展 WebTS 早期预览版发布;微软开源其搜索服务的 SPTAG 算法
- Win10开启远程桌面(只需4步)
- HTML5新特性 day_05(8.11)上传头像、webSocket
- 网站SEO优化中友情链接起到什么作用
- 深度学习-自学习(self taught learning)
- 互联网公司员工看球福利真不少
- jquery增加和移除属性
- 【Day16】移动端布局
- linux修改器修改另一个程序,Linux平台的CE修改器:PINCE(PINCE is not Cheat Engine)