【Spark+Hive+hadoop】基于大数据的大气和海洋动力学数据分析与可视化系统

28 阅读8分钟

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

💕💕文末获取源码

@TOC

【Spark+Hive+hadoop】基于大数据的大气和海洋动力学数据分析与可视化系统-系统功能介绍

《基于大数据的大气和海洋动力学数据分析与可视化系统》以 Hadoop、Spark、Hive 为核心技术架构,支持对大气与海洋领域多维度数据的高效处理与深度分析。系统采用 Python 作为主要开发语言,后端依托 Spark 的分布式计算能力实现海量数据处理,通过 Hive 构建数据仓库对 140 余年全球海平面、大气 CO₂浓度、全球温度异常、海面温度、两极海冰范围等核心数据进行存储与管理,同时结合 Pandas、NumPy 完成数据清洗与预处理。前端采用 Vue+ElementUI+Echarts 实现数据可视化展示,可直观呈现全球气候变化宏观趋势、海洋动力学指标与厄尔尼诺现象关联、极地海冰演变规律等分析结果,用户能通过系统查看不同维度数据的历史变化趋势、年代际对比及关键指标协同演变关系,为大气和海洋领域相关分析提供数据支撑与可视化解决方案。

【Spark+Hive+hadoop】基于大数据的大气和海洋动力学数据分析与可视化系统-系统技术介绍

大数据框架: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+hadoop】基于大数据的大气和海洋动力学数据分析与可视化系统-系统背景意义

当下全球气候变化问题越来越受关注,大气中温室气体浓度变化、海平面上升、极地海冰融化等现象,都需要通过专业的数据处理与分析来梳理规律。传统的数据处理方式面对大气和海洋领域的海量数据时,很容易出现效率低、处理不彻底的问题,没办法快速挖掘数据背后的关联关系。而大数据技术的发展正好能解决这个痛点,Hadoop、Spark 这些框架的分布式计算能力,还有 Hive 的数据仓库功能,能让海量气候与海洋数据的处理变得更高效。作为计算机专业的毕业设计,选择做这个系统,就是想把学到的大数据技术用到实际场景里,尝试用技术手段去处理大气和海洋领域的真实数据,解决传统分析方式的不足,也算是对所学知识的一次实践应用。从学习角度来说,做这个系统能帮着把课堂上学的大数据技术真正用起来,比如 Spark 的分布式计算、Hive 的数据管理,还有数据清洗和可视化相关的知识,通过实际操作能更清楚这些技术怎么在具体场景里落地,提升自己的技术应用能力。从实际应用来看,这个系统能对全球海平面、大气 CO₂浓度、极地海冰范围这些数据进行分析,得出的结果能给想了解气候变化基础规律的人提供一些参考,比如学生做相关课题研究时,说不定能用到系统里的分析思路。不过毕竟这只是个毕业设计,功能和性能上肯定还有很多不足,没办法和专业的科研系统比,但至少能在一定程度上展示大数据技术在大气海洋领域的应用潜力,为类似的小型数据分析项目提供一点借鉴。

【Spark+Hive+hadoop】基于大数据的大气和海洋动力学数据分析与可视化系统-系统演示视频

演示视频

【Spark+Hive+hadoop】基于大数据的大气和海洋动力学数据分析与可视化系统-系统演示图片

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

【Spark+Hive+hadoop】基于大数据的大气和海洋动力学数据分析与可视化系统-系统部分代码

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, year, avg, max, min, corr, when
import pandas as pd
# 初始化SparkSession并集成Hive支持
spark = SparkSession.builder \
.appName("AtmosphereOceanDataAnalysis") \
.enableHiveSupport() \
.getOrCreate()
# 1. 全球海平面(GMSL)长期演变趋势分析核心代码
def analyze_gmsl_long_term_trend():
# 从Hive表读取大气海洋基础数据
df = spark.sql("SELECT Date, GMSL FROM atmosphere_ocean_data WHERE GMSL IS NOT NULL")
# 提取年份字段,按年份聚合计算年度平均海平面
df_with_year = df.withColumn("year", year(col("Date")))
annual_avg_gmsl = df_with_year.groupBy("year") \
.agg(avg("GMSL").alias("annual_avg_gmsl")) \
.orderBy("year")
# 处理可能存在的异常值(将超出合理范围的数据标记为null,后续过滤)
cleaned_gmsl = annual_avg_gmsl.withColumn(
"cleaned_annual_avg_gmsl",
when((col("annual_avg_gmsl") > -10) & (col("annual_avg_gmsl") < 30), col("annual_avg_gmsl")).otherwise(None)
).filter(col("cleaned_annual_avg_gmsl").isNotNull())
# 计算海平面上升速率(基于相邻年份差值的平均)
gmsl_with_lag = cleaned_gmsl.withColumn("prev_year_gmsl", col("cleaned_annual_avg_gmsl").lag(1).over(orderBy("year")))
gmsl_rate = gmsl_with_lag.withColumn(
"yearly_increase",
col("cleaned_annual_avg_gmsl") - col("prev_year_gmsl")
).filter(col("yearly_increase").isNotNull())
avg_annual_rate = gmsl_rate.agg(avg("yearly_increase").alias("avg_annual_gmsl_increase")).first()["avg_annual_gmsl_increase"]
# 将分析结果写入Hive结果表,供后续可视化使用
cleaned_gmsl.withColumn("avg_annual_increase_rate", lit(avg_annual_rate)) \
.write.mode("overwrite").saveAsTable("atmosphere_ocean_results.gmsl_long_term_trend")
return cleaned_gmsl.toPandas()
# 2. 厄尔尼诺-南方涛动(ENSO)事件强度与频率分析核心代码
def analyze_enso_intensity_frequency():
# 从Hive表读取包含Nino 3.4指数的数据
enso_df = spark.sql("SELECT Date, Nino34 FROM atmosphere_ocean_data WHERE Nino34 IS NOT NULL")
# 提取年份和月份,按年月聚合计算月均Nino 3.4指数
enso_df_with_time = enso_df.withColumn("year", year(col("Date"))) \
.withColumn("month", month(col("Date")))
monthly_enso = enso_df_with_time.groupBy("year", "month") \
.agg(avg("Nino34").alias("monthly_avg_nino34")) \
.orderBy("year", "month")
# 定义厄尔尼诺(>0.5)、拉尼娜(<-0.5)和正常(-0.5~0.5)事件的判断条件
enso_classified = monthly_enso.withColumn(
"enso_event_type",
when(col("monthly_avg_nino34") > 0.5, "ElNino")
.when(col("monthly_avg_nino34") < -0.5, "LaNina")
.otherwise("Normal")
)
# 统计每年各类ENSO事件的月份数量(频率分析)
annual_enso_frequency = enso_classified.groupBy("year", "enso_event_type") \
.count().alias("event_months_count") \
.groupBy("year") \
.pivot("enso_event_type", ["ElNino", "LaNina", "Normal"]) \
.agg(sum("event_months_count").alias("event_months")) \
.fillna(0)
# 计算厄尔尼诺事件的强度(取每年厄尔尼诺月份的指数平均值)
elnino_intensity = enso_classified.filter(col("enso_event_type") == "ElNino") \
.groupBy("year") \
.agg(avg("monthly_avg_nino34").alias("elnino_intensity"))
# 合并频率和强度数据,写入Hive结果表
enso_result = annual_enso_frequency.join(elnino_intensity, on="year", how="left").fillna(0, subset=["elnino_intensity"])
enso_result.write.mode("overwrite").saveAsTable("atmosphere_ocean_results.enso_intensity_frequency")
return enso_result.toPandas()
# 3. 北极海冰范围融化趋势分析核心代码
def analyze_arctic_sea_ice_trend():
# 从Hive表读取北极海冰范围数据
arctic_ice_df = spark.sql("SELECT Date, NorthSeaIceExtentAvg FROM atmosphere_ocean_data WHERE NorthSeaIceExtentAvg IS NOT NULL")
# 提取年份,按年份聚合计算年度平均、最大、最小海冰范围
arctic_ice_with_year = arctic_ice_df.withColumn("year", year(col("Date")))
annual_arctic_ice = arctic_ice_with_year.groupBy("year") \
.agg(
avg("NorthSeaIceExtentAvg").alias("annual_avg_ice_extent"),
max("NorthSeaIceExtentAvg").alias("annual_max_ice_extent"),
min("NorthSeaIceExtentAvg").alias("annual_min_ice_extent")
) \
.orderBy("year")
# 过滤异常值(基于北极海冰范围合理区间:3~16百万平方公里)
cleaned_arctic_ice = annual_arctic_ice.filter(
(col("annual_avg_ice_extent") > 3) & (col("annual_avg_ice_extent") < 16) &
(col("annual_max_ice_extent") > 5) & (col("annual_max_ice_extent") < 18) &
(col("annual_min_ice_extent") > 2) & (col("annual_min_ice_extent") < 12)
)
# 计算海冰范围年际变化率(与前10年平均值对比,分析长期趋势)
cleaned_arctic_ice_with_lag = cleaned_arctic_ice.withColumn(
"prev_10y_avg",
avg("annual_avg_ice_extent").over(
Window.orderBy("year").rowsBetween(-10, -1)
)
)
arctic_ice_trend = cleaned_arctic_ice_with_lag.withColumn(
"yoy_change_rate",
(col("annual_avg_ice_extent") - col("prev_10y_avg")) / col("prev_10y_avg") * 100
).fillna(0, subset=["yoy_change_rate"])
# 计算整体融化趋势(基于线性回归的斜率,反映每年平均变化量)
from pyspark.ml.regression import LinearRegression
from pyspark.ml.feature import VectorAssembler
# 准备回归分析数据:年份作为特征,年度平均海冰范围作为标签
assembler = VectorAssembler(inputCols=["year"], outputCol="features")
ice_regression_df = assembler.transform(cleaned_arctic_ice).withColumnRenamed("annual_avg_ice_extent", "label")
lr = LinearRegression(maxIter=10, regParam=0.3, elasticNetParam=0.8)
lr_model = lr.fit(ice_regression_df)
melting_trend_slope = lr_model.coefficients[0]  # 斜率即为每年平均变化量(负值表示减少)
# 将趋势斜率加入结果表,写入Hive
arctic_ice_result = arctic_ice_trend.withColumn("melting_trend_slope", lit(melting_trend_slope))
arctic_ice_result.write.mode("overwrite").saveAsTable("atmosphere_ocean_results.arctic_sea_ice_trend")
return arctic_ice_result.toPandas()
# 调用核心功能函数执行分析
analyze_gmsl_long_term_trend()
analyze_enso_intensity_frequency()
analyze_arctic_sea_ice_trend()
# 关闭SparkSession
spark.stop()

【Spark+Hive+hadoop】基于大数据的大气和海洋动力学数据分析与可视化系统-结语

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