文章目录
传送门:
- 视频地址:黑马程序员Spark全套视频教程
- 1.PySpark基础入门(一)
- 2.PySpark基础入门(二)
- 3.PySpark核心编程(一)
- 4.PySpark核心编程(二)
- 5.PySaprk——SparkSQL学习(一)
- 6.PySaprk——SparkSQL学习(二)
- 7.Spark综合案例——零售业务统计分析
- 8. Spark3新特性及核心概念(背)
一、背景分析
某公司是做零售相关业务,旗下出品各类收银机。目前公司的收银机已经在全国铺开,在各个省份均有店铺使用。机器是联网的,每一次使用都会将售卖商品数据上传到公司后台。老板现在想对省份维度的销售情况进行统计分析。
二、需求与操作分析
1. 需求
- 每个省份的销售额统计
- TOP3 销售省份中,有多少家店铺日均销售额 1000+
- TOP3 省份中各个省份的平均单单价
- TOP3 省份中,各个省份的支付类型比例
2. 操作
- 将需求结果写出到mysql
- 将数据写入到Spark On Hive中
三、数据格式
常用字段解析:
- storeDistrict :店铺所在行政区
- storeProvince:店铺所在省份
- storeID:店铺ID
- storeName:店铺名称
- dateTS:订单日期
- orderID:订单ID
- receivable:收款金额
- payType:付款类型
尽管字段较多, 我们只需要用到上述5个红色字段即可。
四、代码开发
1. 需求一:每个省份的销售额统计
#!usr/bin/env python
# -*- coding:utf-8 -*-
"""
需求:
1. 每个省份的销售额统计
storeProvince 店铺所在省份
receivable 收款金额
2. TOP3 销售省份中,有多少家店铺日均销售额 1000+
storeProvince 店铺所在省份
storeID 店铺ID
dateTS 订单日期
receivable 收款金额
3. TOP3 省份中各个省份的平均单单价
storeProvince 店铺所在省份
receivable 收款金额
4. TOP3 省份中,各个省份的支付类型比例
storeProvince 店铺所在省份
payType 付款类型
操作:
1.写出结果到mysql
2.写出结果到hive库
"""
from pyspark.sql import SparkSession
from pyspark.sql import functions as F
if __name__ == '__main__':
# 构建执行环境入口对象SparkSession
spark = SparkSession.builder. \
appName('SparkSQL Example'). \
master('local[*]'). \
config('spark.sql.shuffle.partitions', '2'). \
config('spark.sql.warehouse.dir', 'hdfs://node1:8020/user/hive/warehouse'). \
config('hive.metastore.uris', 'thrift://node1.itcast.cn:9083'). \
enableHiveSupport(). \
getOrCreate()
# 1.读取数据
# 省份信息:针对省份信息,删除缺失值所在的一整行;同时,省份信息中会有null字符串,需要进行过滤
# 订单金额:数据集中有的订单金额是单笔超过一万的,这些是测试数据
# 列值裁剪
df = spark.read.format('json').load('../../data/input/mini.json'). \
dropna(thresh=1, subset=['storeProvince']). \
filter("storeProvince != 'null'"). \
filter("receivable < 10000"). \
select('storeProvince', 'storeID', 'receivable', 'dateTS', 'payType')
# df.printSchema()
df.show(truncate=False)
# TODO 1:每个省份的销售额统计
province_sale_df = df.groupBy('storeProvince'). \
sum('receivable'). \
withColumnRenamed('sum(receivable)', 'money'). \
withColumn('money', F.round('money', 2)). \
orderBy('money', ascending=False)
province_sale_df.show(truncate=False)
# 写出MYSQL
province_sale_df.write.mode('overwrite'). \
format('jdbc'). \
option('url', 'jdbc:mysql://node1:3306/hive3?useSSL=false&useUnicode=true&characterEncoding=utf8'). \
option('dbtable', 'province_sale'). \
option('user', 'root'). \
option('password', '123456'). \
option('encoding', 'utf-8'). \
save()
# 写出Hive表
# saveAsTable可以写出表,要求已经配置好Spark on hive,配置好后会将表写入到Hive的数据仓库中
province_sale_df.write.mode('overwrite').saveAsTable('default.province_sale', 'parquet')
+--------------+-------+----------+-------------+-------+
|storeProvince |storeID|receivable|dateTS |payType|
+--------------+-------+----------+-------------+-------+
|湖南省 |4064 |22.5 |1563758583000|alipay |
|湖南省 |718 |7.0 |1546737450000|alipay |
|湖南省 |1786 |10.0 |1546478081000|cash |
|广东省 |3702 |10.5 |1559133703000|wechat |
|广西壮族自治区|1156 |10.0 |1548594458000|cash |
|广东省 |318 |3.0 |1548292824000|wechat |
|湖南省 |1699 |6.5 |1545356344000|cash |
|湖南省 |1167 |17.0 |1547284514000|alipay |
|湖南省 |3466 |19.0 |1563845059000|cash |
|广东省 |333 |4.0 |1557231358000|wechat |
|湖南省 |3354 |22.0 |1560692925000|cash |
|广东省 |3367 |19.0 |1552019799000|cash |
|湖南省 |832 |45.0 |1563413959000|wechat |
|湖南省 |949 |6.0 |1565683992000|cash |
|广东省 |4213 |22.5 |1561301033000|cash |
|广东省 |3487 |6.0 |1563104184000|cash |
|湖南省 |2583 |900.0 |1557558714000|cash |
|广东省 |3561 |215.0 |1552703028000|cash |
|湖南省 |1975 |15.0 |1560845929000|cash |
|广东省 |389 |72.0 |1542464496000|cash |
+--------------+-------+----------+-------------+-------+
only showing top 20 rows
+--------------