【Hadoop+HDFS+hive+Spark毕设】基于大数据的家庭能源消耗数据分析与可视化系统

59 阅读10分钟

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

💕💕文末获取源码

@TOC

【Hadoop+HDFS+hive+Spark毕设】基于大数据的家庭能源消耗数据分析与可视化系统-系统功能介绍

本系统《基于大数据的家庭能源消耗数据分析与可视化系统》是一个集数据存储、处理、分析和前端展示于一体的全栈大数据项目。在技术架构上,系统底层采用Hadoop分布式文件系统(HDFS)作为海量原始家庭能耗日志数据的存储基石,保证了数据的高可靠性和可扩展性。在此之上,我们引入了Hive作为数据仓库工具,通过将非结构化的数据映射为结构化表,极大地简化了数据查询与预处理的复杂度,使得开发人员可以使用熟悉的HQL(类SQL语言)对大数据进行高效的ETL操作。系统的核心计算引擎是Apache Spark,它利用其基于内存的计算优势,对从Hive中提取的数据进行高速处理与深度分析。具体分析功能包括但不限于:通过Spark SQL执行多维度聚合分析,如探究不同家庭规模、空调持有状况与能耗的关系;利用Spark MLlib库中的K-Means算法对用户进行无监督聚类,从而挖掘出“节能型”、“常规型”、“高峰依赖型”等典型用户画像,为差异化服务提供数据支撑;系统还创新性地引入了基于ALS算法的协同过滤推荐模块,该模块能够根据用户的历史用能行为模式,智能推荐可能感兴趣的节能策略或用电套餐,实现了从数据分析到主动服务的延伸。后端服务采用主流的SpringBoot框架搭建,负责封装Spark任务的调用接口,并以RESTful API的形式向前端提供结构化的JSON数据。前端界面则基于Vue.js全家桶、ElementUI组件库以及强大的Echarts图表库进行开发,实现了包括能耗趋势折线图、用户画像雷达图、能耗构成饼图等在内的丰富动态可视化效果,最终为用户呈现了一个直观、易于交互的数据分析与决策支持平台。

【Hadoop+HDFS+hive+Spark毕设】基于大数据的家庭能源消耗数据分析与可视化系统-系统技术介绍

大数据框架: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

【Hadoop+HDFS+hive+Spark毕设】基于大数据的家庭能源消耗数据分析与可视化系统-系统背景意义

在全球倡导“碳达峰”与“碳中-和”的大背景下,能源的精细化管理已经从宏观的工业领域,逐渐渗透到我们日常生活的方方面面。家庭用电作为社会总能耗的重要组成部分,其管理方式却普遍比较粗放。说白了,很多时候我们只知道一个月用了多少电,但对自己家庭的用电高峰期、哪些因素导致电费偏高、以及和邻居比起来用电习惯好不好等问题,其实是一头雾水。与此同时,电力公司积累了海量的用户用电数据,这些数据就像一座座沉睡的金矿,里面蕴含着巨大的价值。传统的数据处理方式在面对TB甚至PB级别的用电数据时,往往显得力不从心。这就为大数据技术的应用提供了一个非常合适的舞台。将Hadoop、Spark这类主流的大数据技术应用到家庭能耗数据分析上,不再是一个遥远的概念,而是一个既有现实需求又能锻炼我们技术能力的方向。所以,做这样一个课题,既能响应节能减排的社会趋势,也能让我们把课堂上学的分布式计算理论真正地用起来,解决一个看得见摸得着的问题。虽然这只是一个毕业设计,但我感觉它在好几个方面还是挺有意思的。从实际应用的角度来看,这个系统可以算是一个简化版的电力需求侧管理平台原型。对于电力部门来说,通过系统提供的用户画像和能耗分析结果,他们能更清晰地了解不同区域、不同类型家庭的用电规律,甚至可以更精准地预测出迎峰度夏期间的用电负荷,这对保障电网的稳定运行是有一定帮助的。对普通家庭用户而言,通过可视化图表,大家能一目了然地看到自家的用电“账单”到底是怎么构成的,比如周末用电是不是比工作日高很多,或者高温天气下空调到底耗了多少电。系统里的协同过滤推荐功能,打个比方,就像音乐软件给你推歌一样,它能根据你的用电习惯,给你推荐一些可能适合你的节能小窍门,这比千篇一律的宣传口号要实用得多。从我们学生的技术成长角度讲,这个项目的意义就更直接了。它覆盖了从数据采集、HDFS存储、Hive建仓、Spark处理分析,再到后端API开发和前端Vue展示的完整流程,是一个非常扎实的全栈大数据项目实践,能把分布式计算、机器学习算法和Web开发技术串联起来,做完之后对整个大数据应用开发体系的理解肯定会深刻不少。

【Hadoop+HDFS+hive+Spark毕设】基于大数据的家庭能源消耗数据分析与可视化系统-系统演示视频

演示视频

【Hadoop+HDFS+hive+Spark毕设】基于大数据的家庭能源消耗数据分析与可视化系统-系统演示图片

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

【Hadoop+HDFS+hive+Spark毕设】基于大数据的家庭能源消耗数据分析与可视化系统-系统部分代码

from pyspark.sql import SparkSession

from pyspark.sql.functions import avg, col, when

from pyspark.ml.feature import VectorAssembler

from pyspark.ml.clustering import KMeans

from pyspark.ml.recommendation import ALS

#【注意】以下代码块为一个整体,所有函数逻辑紧密相连,无空行,旨在展示一个连续的处理流程。

#========== 1. 初始化SparkSession并启用Hive支持 ==========

spark = SparkSession.builder \

    .appName("HouseholdEnergyAnalysis") \

    .config("spark.sql.warehouse.dir", "/user/hive/warehouse") \

    .enableHiveSupport() \

    .getOrCreate()

#========== 2. 核心功能一:按家庭规模聚合分析平均能耗 ==========

def calculate_avg_consumption_by_size(table_name="household_energy.consumption_data"):

    """

    此函数从指定的Hive表中读取数据。

    然后按家庭规模(Household_Size)进行分组。

    计算每个规模分组的平均总能耗(Energy_Consumption_kWh)。

    同时计算人均能耗,以评估能源使用效率。

    最后,将结果进行排序以便于观察。

    这是一个基础但非常核心的聚合分析功能。

    它展示了Spark SQL在数据初步探查中的强大能力。

    """

    print("--- 正在执行核心功能一:按家庭规模聚合分析平均能耗 ---")

    energy_df = spark.sql(f"SELECT Household_Size, Energy_Consumption_kWh FROM {table_name}")

    # 过滤掉家庭规模或能耗为空的无效数据

    valid_data_df = energy_df.filter(col("Household_Size").isNotNull() & col("Energy_Consumption_kWh").isNotNull())

    # 增加人均能耗列用于更深度的分析

    per_capita_df = valid_data_df.withColumn("per_capita_consumption", col("Energy_Consumption_kWh") / col("Household_Size"))

    # 按家庭规模分组,并计算总能耗和人均能耗的平均值

    agg_df = per_capita_df.groupBy("Household_Size") \

        .agg(

            avg("Energy_Consumption_kWh").alias("avg_total_consumption"),

            avg("per_capita_consumption").alias("avg_per_capita_consumption")

        ) \

        .orderBy("Household_Size")

    agg_df.show(10, truncate=False)

    return agg_df

#========== 3. 核心功能二:使用K-Means对用户进行聚类,构建用户画像 ==========

def perform_user_clustering(table_name="household_energy.consumption_data", k=4):

    """

    此函数旨在通过机器学习算法为用户打上标签。

    我们选取了'人均能耗'和'高峰时段用电占比'作为聚类特征。

    首先,需要从原始数据计算这两个指标。

    然后,使用VectorAssembler将多个特征合并为单一的特征向量。

    接着,初始化KMeans模型,并设置聚类的簇数(k)。

    通过训练数据来拟合模型(fit)。

    最后,使用训练好的模型对所有用户进行预测(transform)。

    得到每个用户的所属簇别,即用户画像标签。

    这个功能是系统从统计分析迈向智能分析的关键一步。

    """

    print(f"--- 正在执行核心功能二:使用K-Means进行用户聚类(k={k}) ---")

    query = f"SELECT Household_ID, Household_Size, Energy_Consumption_kWh, Peak_Hours_Usage_kWh FROM {table_name}"

    cluster_raw_df = spark.sql(query)

    # 计算用于聚类的特征:人均能耗 和 高峰用电占比

    feature_df = cluster_raw_df.withColumn("per_capita_consumption", col("Energy_Consumption_kWh") / col("Household_Size")) \

                               .withColumn("peak_usage_ratio", col("Peak_Hours_Usage_kWh") / col("Energy_Consumption_kWh"))

    # 过滤掉计算后可能产生的空值或无穷大值

    feature_df_clean = feature_df.filter(col("per_capita_consumption").isNotNull() & col("peak_usage_ratio").isNotNull())

    # 将特征合并为向量

    assembler = VectorAssembler(inputCols=["per_capita_consumption", "peak_usage_ratio"], outputCol="features")

    assembled_data = assembler.transform(feature_df_clean)

    # 初始化并训练K-Means模型

    kmeans = KMeans(k=k, seed=1, featuresCol="features", predictionCol="cluster_id")

    model = kmeans.fit(assembled_data)

    # 对用户进行预测并展示结果

    predictions = model.transform(assembled_data)

    user_portraits = predictions.select("Household_ID", "cluster_id")

    user_portraits.show(10, truncate=False)

    # 计算每个簇的中心点,用于解释簇的含义

    print("各用户群体的中心点(人均能耗, 高峰用电占比):")

    for center in model.clusterCenters():

        print(center)

    return user_portraits

#========== 4. 核心功能三:基于协同过滤(ALS)为用户推荐节能策略 ==========

def run_collaborative_filtering_recommendation(table_name="household_energy.consumption_data"):

    """

    此函数模拟一个推荐场景。

    我们假设系统中有多种节能策略(用数字ID表示)。

    用户对策略的“评分”可以由其用能行为来隐式定义。

    例如,高峰用电占比高的用户,可以认为他对“错峰用电”策略有更高的“评分”(需求)。

    这里我们简化处理,将'Household_ID'视为用户,将'星期几'视为物品(item),能耗作为评分。

    目的是找到与用户在用能时间模式上相似的其他用户。

    首先,将日期转换为星期几作为物品ID。

    然后,初始化ALS(交替最小二乘法)模型。

    训练模型后,为每个用户推荐他们可能“高消费”的星期。

    这在现实中可以转化为:“您与X用户类似,他们在周五用电较多,请注意该时段的节能”。

    这是系统实现个性化服务与主动交互的核心体现。

    """

    print("--- 正在执行核心功能三:基于协同过滤(ALS)进行推荐 ---")

    # 为了使用ALS,需要 user, item, rating三元组。此处进行模拟。

    # 将Household_ID转为数值型作为user_id,将星期几作为item_id

    from pyspark.sql.functions import dayofweek

    als_raw_df = spark.sql(f"SELECT Household_ID, Date, Energy_Consumption_kWh FROM {table_name}")

    als_data_df = als_raw_df.withColumn("user_id", col("Household_ID").cast("integer")) \

                             .withColumn("item_id", dayofweek(col("Date"))) \

                             .select(col("user_id"), col("item_id"), col("Energy_Consumption_kWh").alias("rating")) \

                             .na.drop() # 确保没有空值

    # 划分训练集和测试集

    (training, test) = als_data_df.randomSplit([0.8, 0.2])

    # 初始化并训练ALS模型

    als = ALS(maxIter=5, regParam=0.01, userCol="user_id", itemCol="item_id", ratingCol="rating", coldStartStrategy="drop", implicitPrefs=True)

    model = als.fit(training)

    # 为每个用户推荐前3个最相关的“物品”(星期)

    user_recs = model.recommendForAllUsers(3)

    print("为部分用户推荐的节能关注日(星期):")

    user_recs.show(10, truncate=False)

    return user_recs

#========== 模拟执行入口 ==========

# calculate_avg_consumption_by_size()

# perform_user_clustering()

# run_collaborative_filtering_recommendation()

【Hadoop+HDFS+hive+Spark毕设】基于大数据的家庭能源消耗数据分析与可视化系统-结语

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