【Spark+Hive大数据】基于大数据的超市销售数据统计分析系统

46 阅读8分钟

💖💖作者:计算机编程小央姐 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜

💕💕文末获取源码

@TOC

【Spark+Hive大数据】基于大数据的超市销售数据统计分析系统-系统功能介绍

《基于 Spark+Hive 的大数据超市销售数据统计分析系统》是面向超市经营管理场景设计的大数据分析解决方案,依托 Spark 强大的分布式计算能力与 Hive 的数据仓库存储优势,整合 Python/Java 开发语言、Spring Boot/Django 后端框架及 Vue+Echarts 前端技术,实现对超市销售数据的多维度深度挖掘。系统覆盖商品销售、时间趋势、促销效果、顾客行为及商品关联五大核心分析维度,包含畅销商品 TOP20 统计、RFM 顾客分层、促销效果评估、商品关联规则挖掘等实用功能,通过结构化的数据处理流程与可视化的分析结果展示,帮助使用者快速掌握超市销售规律,为商品采购、营销策略优化、库存管理等决策提供数据支撑,整体设计兼顾技术实现的可行性与实际应用的实用性,适合作为大数据方向毕业设计的实践载体。

【Spark+Hive大数据】基于大数据的超市销售数据统计分析系统-系统技术介绍

大数据框架:Hadoop+Spark(本次没用Hive,支持定制) 开发语言:Python+Java(两个版本都支持) 后端框架:Django+Spring Boot(Spring+SpringMVC+Mybatis)(两个版本都支持) 前端:Vue+ElementUI+Echarts+HTML+CSS+JavaScript+jQuery 详细技术点:Hadoop、HDFS、Spark、Spark SQL、Pandas、NumPy 数据库:MySQL

【Spark+Hive大数据】基于大数据的超市销售数据统计分析系统-系统背景意义

随着超市行业规模的不断扩大,日常经营中积累的销售数据呈爆发式增长,这些数据包含商品销售明细、顾客消费记录、促销活动效果等多类信息,若仅依靠传统人工统计或简单数据处理方式,很难从中挖掘出有价值的决策依据。当前多数中小型超市在数据利用方面存在明显不足,往往只能获取基础的销售总额、库存数量等表层信息,对于商品热销规律、顾客消费偏好、促销活动性价比等深层次问题缺乏有效分析手段,导致经营决策多依赖经验判断,容易出现商品结构不合理、促销资源浪费等问题。而大数据技术的发展为解决这一困境提供了有效途径,Spark 作为高效的分布式计算框架,搭配 Hive 的数据存储能力,能够快速处理海量销售数据,因此设计一套基于 Spark+Hive 的超市销售数据统计分析系统,成为解决超市数据处理痛点的合理选择。从实际应用角度来看,该系统能够帮助超市相关人员更高效地处理销售数据,直观呈现商品销售趋势、顾客消费特征等关键信息,为经营决策提供数据参考,一定程度上提升超市的运营效率与管理水平,具有一定的实际应用价值。从技术实践角度而言,系统整合了 Spark、Hive、Spring Boot/Vue 等主流技术,涵盖大数据处理、前后端开发、数据可视化等多个技术要点,能够有效锻炼开发者的技术综合应用能力与问题解决能力,符合计算机专业毕业设计对实践能力培养的要求。此外,该选题聚焦于真实的行业应用场景,将大数据技术与超市经营管理需求相结合,既保证了课题的实用性,又兼顾了技术的前沿性,可为后续类似数据统计分析系统的开发提供一定的参考思路,其研究成果具有一定的借鉴意义。

【Spark+Hive大数据】基于大数据的超市销售数据统计分析系统-系统演示视频

演示视频

【Spark+Hive大数据】基于大数据的超市销售数据统计分析系统-系统演示图片

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

【Spark+Hive大数据】基于大数据的超市销售数据统计分析系统-系统部分代码

from pyspark.sql import SparkSession from pyspark.sql.functions import col, sum, count, rank, desc, avg, when, date_format, split from pyspark.sql.window import Window # 初始化SparkSession并集成Hive spark = SparkSession.builder.appName("SupermarketSalesAnalysis") \     .config("spark.sql.warehouse.dir", "/user/hive/warehouse") \     .enableHiveSupport() \     .getOrCreate() # 1. 畅销商品TOP20分析核心代码 def top20_best_selling_products():     # 从Hive中读取销售数据表     sales_df = spark.sql("SELECT product_id, product_name, sales_quantity, sales_amount FROM supermarket.sales_detail")     # 按商品编码和名称分组,计算总销量和总销售额     product_sales_df = sales_df.groupBy("product_id", "product_name") \         .agg(             sum("sales_quantity").alias("total_sales_quantity"),             sum("sales_amount").alias("total_sales_amount")         )     # 定义窗口函数,按总销售额降序排序     window_spec = Window.orderBy(desc("total_sales_amount"))     # 添加排名列,取前20名     top20_products_df = product_sales_df.withColumn("rank", rank().over(window_spec)) \         .filter(col("rank") <= 20) \         .orderBy("rank")     # 处理可能的商品名称为空的情况     top20_products_df = top20_products_df.withColumn("product_name", when(col("product_name").isNull(), "未知商品").otherwise(col("product_name")))     # 将结果写入Hive表供前端查询     top20_products_df.write.mode("overwrite").saveAsTable("supermarket.top20_best_selling_products")     return top20_products_df # 2. 顾客价值RFM分析核心代码 def customer_rfm_analysis():     # 从Hive读取销售数据,包含顾客编号、销售日期、销售金额     sales_df = spark.sql("SELECT customer_id, sales_date, sales_amount FROM supermarket.sales_detail")     # 转换销售日期格式为日期类型     sales_df = sales_df.withColumn("sales_date", col("sales_date").cast("date"))     # 计算当前分析日期(取数据中最大日期)     current_date = sales_df.agg(max("sales_date")).first()[0]     # 按顾客分组计算RFM三个指标:最近消费天数、消费频率、消费金额     rfm_df = sales_df.groupBy("customer_id") \         .agg(             datediff(current_date, max("sales_date")).alias("recency"),  # 最近消费天数(越小越好)             count("sales_date").alias("frequency"),  # 消费频率(越大越好)             sum("sales_amount").alias("monetary")  # 消费金额(越大越好)         )     # 定义分位数用于划分RFM等级(1-5级,5级最优)     r_quantiles = rfm_df.stat.approxQuantile("recency", [0.2, 0.4, 0.6, 0.8], 0.01)     f_quantiles = rfm_df.stat.approxQuantile("frequency", [0.2, 0.4, 0.6, 0.8], 0.01)     m_quantiles = rfm_df.stat.approxQuantile("monetary", [0.2, 0.4, 0.6, 0.8], 0.01)     # 计算RFM等级(R反向计分,因为值越小越好)     rfm_df = rfm_df.withColumn("r_score", when(col("recency") <= r_quantiles[0], 5)                                .when(col("recency") <= r_quantiles[1], 4)                                .when(col("recency") <= r_quantiles[2], 3)                                .when(col("recency") <= r_quantiles[3], 2)                                .otherwise(1))     rfm_df = rfm_df.withColumn("f_score", when(col("frequency") >= f_quantiles[3], 5)                                .when(col("frequency") >= f_quantiles[2], 4)                                .when(col("frequency") >= f_quantiles[1], 3)                                .when(col("frequency") >= f_quantiles[0], 2)                                .otherwise(1))     rfm_df = rfm_df.withColumn("m_score", when(col("monetary") >= m_quantiles[3], 5)                                .when(col("monetary") >= m_quantiles[2], 4)                                .when(col("monetary") >= m_quantiles[1], 3)                                .when(col("monetary") >= m_quantiles[0], 2)                                .otherwise(1))     # 顾客分层:高价值、重要发展、重要保持、重要挽留、一般价值、低价值     rfm_df = rfm_df.withColumn("customer_segment", when((col("r_score") >= 4) & (col("f_score") >= 4) & (col("m_score") >= 4), "高价值顾客")                                .when((col("r_score") >= 3) & (col("f_score") >= 3) & (col("m_score") >= 4), "重要发展顾客")                                .when((col("r_score") >= 4) & (col("f_score") >= 2) & (col("m_score") >= 3), "重要保持顾客")                                .when((col("r_score") <= 2) & (col("f_score") >= 3) & (col("m_score") >= 3), "重要挽留顾客")                                .when((col("r_score") >= 3) & (col("f_score") >= 2) & (col("m_score") >= 2), "一般价值顾客")                                .otherwise("低价值顾客"))     # 保存结果到Hive表     rfm_df.write.mode("overwrite").saveAsTable("supermarket.customer_rfm_segmentation")     return rfm_df # 3. 商品关联规则挖掘核心代码(基于购物篮分析) def product_association_analysis():     # 从Hive读取销售数据,按顾客和购物日期分组获取购物篮     sales_df = spark.sql("SELECT customer_id, sales_date, product_id, product_name FROM supermarket.sales_detail")     # 按顾客和销售日期分组,聚合每个购物篮中的商品     basket_df = sales_df.groupBy("customer_id", "sales_date") \         .agg(collect_list("product_id").alias("product_ids"),              collect_list("product_name").alias("product_names"))     # 过滤掉商品数量小于2的购物篮(无关联分析价值)     basket_df = basket_df.filter(size(col("product_ids")) >= 2)     # 生成商品组合(有序对,避免重复)     from itertools import combinations     def generate_product_pairs(products):         return list(combinations(sorted(products), 2))     # 注册UDF函数生成商品对     generate_pairs_udf = udf(generate_product_pairs, ArrayType(ArrayType(StringType())))     basket_pairs_df = basket_df.withColumn("product_pairs", generate_pairs_udf(col("product_ids"))) \         .withColumn("product_name_pairs", generate_pairs_udf(col("product_names")))     # 展开商品对     pair_df = basket_pairs_df.select(col("customer_id"), col("sales_date"),                                     explode(col("product_pairs")).alias("product_pair"),                                     explode(col("product_name_pairs")).alias("product_name_pair"))     # 拆分商品对为前项和后项     pair_df = pair_df.withColumn("antecedent", col("product_pair")[0]) \         .withColumn("consequent", col("product_pair")[1]) \         .withColumn("antecedent_name", col("product_name_pair")[0]) \         .withColumn("consequent_name", col("product_name_pair")[1])     # 计算支持度(商品对出现的次数)     pair_support_df = pair_df.groupBy("antecedent", "consequent", "antecedent_name", "consequent_name") \         .agg(count("*").alias("pair_count"))     # 计算每个商品作为前项的总次数     antecedent_count_df = pair_df.groupBy("antecedent") \         .agg(count("*").alias("antecedent_total"))     # 关联计算置信度(置信度=商品对次数/前项总次数)     association_df = pair_support_df.join(antecedent_count_df, "antecedent", "left") \         .withColumn("confidence", col("pair_count") / col("antecedent_total"))     # 计算总购物篮数,用于计算支持度(支持度=商品对次数/总购物篮数)     total_baskets = basket_df.count()     association_df = association_df.withColumn("support", col("pair_count") / total_baskets)     # 过滤出置信度大于0.1且支持度大于0.05的关联规则(可调整阈值)     filtered_association_df = association_df.filter((col("confidence") > 0.1) & (col("support") > 0.05)) \         .orderBy(desc("confidence"), desc("support"))     # 保存结果到Hive表     filtered_association_df.write.mode("overwrite").saveAsTable("supermarket.product_association_rules")     return filtered_association_df

【Spark+Hive大数据】基于大数据的超市销售数据统计分析系统-结语

💟💟如果大家有任何疑虑,欢迎在下方位置详细交流。