💖💖作者:计算机编程小央姐 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长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大数据】基于大数据的超市销售数据统计分析系统-结语
💟💟如果大家有任何疑虑,欢迎在下方位置详细交流。