记录使用Spark计算订单明细表销量排行榜的实现

一、引入相关依赖(版本很重要)

<!--以下版本经过测试验证-->
<dependency>
	<groupId>org.apache.spark</groupId>
	<artifactId>spark-core_2.12</artifactId>
	<version>3.5.3</version>
</dependency>
<dependency>
	<groupId>org.apache.spark</groupId>
	<artifactId>spark-sql_2.12</artifactId>
	<version>3.5.3</version>
</dependency>
<dependency>
	<groupId>io.netty</groupId>
	<artifactId>netty-all</artifactId>
	<version>4.1.58.Final</version>
</dependency>
<dependency>
	<groupId>org.codehaus.janino</groupId>
	<artifactId>janino</artifactId>
	<version>3.1.6</version>
</dependency>

二、实现Spark编码

  • ProductRanking.java
public class ProductRanking {
    private Long skuId;
    private String goodsName;
    private Double totalQuantity;
    private Double totalSales;

    public ProductRanking(Long skuId, String goodsName, Double totalQuantity, Double totalSales) {
        this.skuId = skuId;
        this.goodsName = goodsName;
        this.totalQuantity = totalQuantity;
        this.totalSales = totalSales;
    }

    public Long getSkuId() {
        return skuId;
    }

    public void setSkuId(Long skuId) {
        this.skuId = skuId;
    }

    public String getGoodsName() {
        return goodsName;
    }

    public void setGoodsName(String goodsName) {
        this.goodsName = goodsName;
    }

    public Double getTotalQuantity() {
        return totalQuantity;
    }

    public void setTotalQuantity(Double totalQuantity) {
        this.totalQuantity = totalQuantity;
    }

    public Double getTotalSales() {
        return totalSales;
    }

    public void setTotalSales(Double totalSales) {
        this.totalSales = totalSales;
    }
}
  • SparkJob.java
public class SparkJob {
    public List<ProductRanking> getRanking(){
        // 初始化 SparkSession
        SparkSession spark = SparkSession.builder()
                .appName("Order Item Ranking")
                .master("local[*]")  // 使用本地模式
                .getOrCreate();

        // MySQL JDBC 连接配置
        String jdbcUrl = "jdbc:mysql://localhost:3306/atest?useUnicode=true&characterEncoding=utf8&useSSL=false";
        Properties jdbcProps = new Properties();
        jdbcProps.put("user", "root");
        jdbcProps.put("password", "123456");
        jdbcProps.put("driver", "com.mysql.jdbc.Driver");

        // 设置查询条件:假设要查询 2023 年 1 月 1 日之后的订单
        String query = "(SELECT * FROM nasi_mts_trade_order_item ) AS order_item_filtered";

        // 从 MySQL 中读取符合条件的 order_item 表数据
        Dataset<Row> orderItemDF = spark.read()
                .jdbc(jdbcUrl, query, jdbcProps);

        // 显示数据的前几行,检查数据是否加载正确
//        orderItemDF.show();

        // 统计每个商品的销量
        Dataset<Row> productRankingDF = orderItemDF.groupBy("sku_id", "goods_name")
                .agg(
                        functions.sum("net_weight").alias("total_quantity"),
                        functions.sum(functions.col("net_weight").multiply(functions.col("goods_price"))).alias("total_sales")
                )
                .orderBy(functions.col("total_quantity").desc())  // 按销量降序排序
                .limit(10);  // 获取销量前10名

        // 显示商品排名
//        productRankingDF.show();

        // 转换为 JSON 并映射为 Java 对象
        List<Row> rows = productRankingDF.collectAsList();

        // 将每一行映射为 com.cnnasi.erp.mts.spark.ProductRanking 对象
        List<ProductRanking> ra = rows.stream().map(row -> new ProductRanking(
                row.getAs("sku_id"),
                row.getAs("goods_name"),
                row.getAs("total_quantity"),
                row.getAs("total_sales")
        )).collect(Collectors.toList());
        log.info(JSONObject.toJSONString(ra));
        // 停止 SparkSession
        spark.stop();
        return ra;
    }
}
功能1. 订单全流程数据分析与可视化:​ 利用 Hadoop 处理美团外卖订单数据(订单 ID、用户 ID、商家 ID、骑手 ID、下单时间、送达时间、商品清单、订单金额、配送距离、用户评价等),通过 Hive 进行数据清洗、格式转换与聚合计算使用可视化工具,以漏斗图展示从下单到完成的订单流失环节;用折线图分析不同时段(早午晚餐、节假日)的订单量变化趋势;以地图热力图呈现区域订单密度分布,帮助平台优化资源调配,提升订单完成率。​ 功能2. 骑手配送效率分析与可视化优化:​ 通过 Hadoop 存储骑手配送数据(骑手 ID、接单时间、取餐时间、送餐时间、配送里程、异常订单记录等),利用 Hive 计算骑手平均配送时长、准时率、单日接单量等指标。使用可视化工具,在地图上标注骑手实时位置与配送路线;以仪表盘展示骑手绩效排名;用甘特图对比不同骑手的订单处理节奏,为骑手排班、奖惩制度制定提供数据支持,提高整体配送效率。​ 功能3. 商家经营状况分析与可视化评估:​ 基于商家数据(商家 ID、商品类别、菜品销量、用户评分、差评原因、营业时长、促销活动记录等),运用 Hadoop 与 Hive 分析商家销售额、复购率、用户满意度等核心指标。使用可视化工具,以柱状图对比同类商家的销量与评分;用词云图提取差评高频关键词;通过折线图展示促销活动对销量的影响,帮助商家优化菜品结构、调整营销策略,同时为平台筛选优质商家提供依据。​ 功能4. 用户消费行为与偏好分析可视化:​ 借助 Hadoop 处理用户行为数据(用户 ID、订单频次、消费金额、商品品类偏好、支付方式、评价习惯等),通过 Hive 挖掘用户消费特征。使用可视化工具,以饼图展示用户消费金额分布区间;用热力图呈现用户下单时段与品类的关联;通过用户画像仪表盘展示高价值用户特征,助力平台实现精准营销、个性化推荐,提升用户粘性。​ 功能5. 热门菜品与区域消费趋势可视化:​ 利用 Hadoop 对菜品销售数据(菜品 ID、所属商家、销量、销售额、地域分布等)进行分析,通过 Hive 统计不同区域、时段的热门菜品及销量变化。使用可视化工具,在地图上标注各区域的。 怎么完成上述五个功能,我没有数据,帮我拟造每个功能两万个数据
06-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

老齐谈电商

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

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

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

打赏作者

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

抵扣说明:

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

余额充值