PySpark | Spark综合案例:零售业务统计分析


传送门:


一、背景分析

  某公司是做零售相关业务,旗下出品各类收银机。目前公司的收银机已经在全国铺开,在各个省份均有店铺使用。机器是联网的,每一次使用都会将售卖商品数据上传到公司后台。老板现在想对省份维度的销售情况进行统计分析。

二、需求与操作分析

1. 需求

  1. 每个省份的销售额统计
  2. TOP3 销售省份中,有多少家店铺日均销售额 1000+
  3. TOP3 省份中各个省份的平均单单价
  4. TOP3 省份中,各个省份的支付类型比例

2. 操作

  1. 将需求结果写出到mysql
  2. 将数据写入到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

+--------------
  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幼稚的人呐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值