基于Hadoop+Spark的食物营养数据可视化系统完整开发教程

62 阅读9分钟

🎓 作者:计算机毕设小月哥 | 软件开发专家

🖥️ 简介:8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。

🛠️ 专业服务 🛠️

  • 需求定制化开发

  • 源码提供与讲解

  • 技术文档撰写(指导计算机毕设选题【新颖+创新】、任务书、开题报告、文献综述、外文翻译等)

  • 项目答辩演示PPT制作

🌟 欢迎:点赞 👍 收藏 ⭐ 评论 📝

👇🏻 精选专栏推荐 👇🏻 欢迎订阅关注!

大数据实战项目

PHP|C#.NET|Golang实战项目

微信小程序|安卓实战项目

Python实战项目

Java实战项目

🍅 ↓↓主页获取源码联系↓↓🍅

基于大数据的食物营养数据可视化分析系统-功能介绍

基于Hadoop+Spark的食物营养数据可视化系统是一个集成了大数据处理技术与现代Web开发技术的综合性分析平台,该系统通过Hadoop分布式文件系统存储大量食物营养数据,利用Spark强大的内存计算能力进行高效数据处理和分析。系统后端采用Django框架构建RESTful API接口,结合Spark SQL实现复杂的营养数据查询和统计分析,前端使用Vue.js配合ElementUI组件库构建用户界面,通过Echarts图表库将分析结果以直观的可视化图表形式展现给用户。系统核心功能涵盖五大分析维度:宏观营养格局分析能够统计所有食物的营养素整体分布情况,特定营养素排名与筛选分析可以快速定位高蛋白、高钙、低热量等特定需求的食物,食物分类对比分析通过对不同类别食物的营养特征进行横向比较,膳食健康与风险因素分析揭示营养素之间的关联关系,高级算法探索分析则运用K-Means聚类算法发现食物的隐藏营养模式。整个系统充分发挥了大数据技术在海量数据处理方面的优势,为用户提供科学准确的营养分析和健康饮食指导。

基于大数据的食物营养数据可视化分析系统-选题背景意义

选题背景 随着人们生活水平的不断提高和健康意识的日益增强,营养膳食搭配已经成为现代生活中不可忽视的重要话题。传统的营养分析方法往往依赖于简单的查表对比或者小规模的统计分析,面对庞大复杂的食物营养数据时显得力不从心,无法深入挖掘食物之间的营养关联性和潜在规律。与此同时,大数据技术的快速发展为海量营养数据的处理和分析提供了全新的技术路径,Hadoop分布式存储系统能够高效管理TB级别的营养数据,Spark内存计算框架可以实现毫秒级的复杂查询和统计分析,这些技术优势为构建智能化的营养分析系统奠定了坚实的基础。当前市场上虽然存在一些营养查询工具,但大多功能单一,缺乏深度的数据挖掘能力和直观的可视化展示,难以满足用户对营养数据全方位分析的需求。在这样的背景下,开发一套基于大数据技术的食物营养数据可视化分析系统,将先进的分布式计算技术与营养健康领域相结合,具有重要的现实意义和技术价值。 选题意义 本课题的研究意义主要体现在技术创新和实际应用两个层面。从技术角度来看,该系统将大数据处理技术引入营养分析领域,探索了Hadoop+Spark技术栈在非传统大数据场景下的应用可能性,为相关技术在健康医疗领域的推广应用提供了参考案例,同时系统中运用的K-Means聚类算法能够从数据本身发现食物的营养分组模式,这种数据驱动的分析方法相比传统的人工分类更加客观准确。从实际应用价值来说,系统为普通用户提供了一个便捷的营养查询和分析工具,帮助人们更好地了解日常食物的营养构成,做出更加科学合理的饮食选择,对于提升公众的营养健康意识具有积极作用。另外,系统的可视化分析功能将复杂的营养数据转化为直观易懂的图表形式,降低了普通用户理解和使用营养数据的门槛,使得科学的营养知识能够更好地服务于大众生活。当然,作为一个毕业设计项目,本系统更多地是在技术实践和知识综合应用方面发挥作用,为后续更深入的研究和开发奠定基础。

基于大数据的食物营养数据可视化分析系统-技术选型

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

基于大数据的食物营养数据可视化分析系统-视频展示

基于大数据的食物营养数据可视化分析系统-视频展示

基于大数据的食物营养数据可视化分析系统-图片展示

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

基于大数据的食物营养数据可视化分析系统-代码展示

from pyspark.sql import SparkSession
from pyspark.ml.clustering import KMeans
from pyspark.ml.feature import VectorAssembler
from pyspark.sql.functions import col, avg, max, min, count, desc, asc
import numpy as np
from django.http import JsonResponse

def macro_nutrition_analysis(request):
    spark = SparkSession.builder.appName("NutritionMacroAnalysis").master("local[*]").getOrCreate()
    df = spark.read.option("header", "true").option("inferSchema", "true").csv("hdfs://localhost:9000/nutrition_data/cleaned_nutrition_dataset_per100g.csv")
    total_foods = df.count()
    nutrition_stats = df.select(
        avg(col("热量")).alias("avg_calories"),
        avg(col("蛋白质")).alias("avg_protein"),
        avg(col("脂肪")).alias("avg_fat"),
        avg(col("碳水化合物")).alias("avg_carbs"),
        avg(col("钠")).alias("avg_sodium"),
        avg(col("糖")).alias("avg_sugar"),
        max(col("热量")).alias("max_calories"),
        min(col("热量")).alias("min_calories")
    ).collect()[0]
    calorie_distribution = df.selectExpr(
        "CASE WHEN 热量 < 100 THEN '低热量(0-100)' WHEN 热量 < 300 THEN '中等热量(100-300)' WHEN 热量 < 500 THEN '高热量(300-500)' ELSE '极高热量(500+)' END as calorie_range"
    ).groupBy("calorie_range").count().orderBy(desc("count")).collect()
    macro_composition = df.select(
        (avg(col("蛋白质")) * 4).alias("protein_calories"),
        (avg(col("脂肪")) * 9).alias("fat_calories"),
        (avg(col("碳水化合物")) * 4).alias("carbs_calories")
    ).collect()[0]
    total_macro_calories = macro_composition.protein_calories + macro_composition.fat_calories + macro_composition.carbs_calories
    mineral_stats = df.select(
        avg(col("钙")).alias("avg_calcium"),
        avg(col("铁")).alias("avg_iron"),
        avg(col("钠")).alias("avg_sodium"),
        max(col("钙")).alias("max_calcium"),
        max(col("铁")).alias("max_iron")
    ).collect()[0]
    vitamin_stats = df.select(
        avg(col("维生素C")).alias("avg_vitamin_c"),
        avg(col("维生素B11")).alias("avg_vitamin_b11"),
        max(col("维生素C")).alias("max_vitamin_c"),
        max(col("维生素B11")).alias("max_vitamin_b11")
    ).collect()[0]
    spark.stop()
    return JsonResponse({
        'total_foods': total_foods,
        'nutrition_averages': {
            'calories': round(nutrition_stats.avg_calories, 2),
            'protein': round(nutrition_stats.avg_protein, 2),
            'fat': round(nutrition_stats.avg_fat, 2),
            'carbs': round(nutrition_stats.avg_carbs, 2),
            'sodium': round(nutrition_stats.avg_sodium, 2),
            'sugar': round(nutrition_stats.avg_sugar, 2)
        },
        'calorie_distribution': [{'range': row.calorie_range, 'count': row.count} for row in calorie_distribution],
        'macro_composition_percent': {
            'protein': round((macro_composition.protein_calories / total_macro_calories) * 100, 1),
            'fat': round((macro_composition.fat_calories / total_macro_calories) * 100, 1),
            'carbs': round((macro_composition.carbs_calories / total_macro_calories) * 100, 1)
        },
        'mineral_averages': {
            'calcium': round(mineral_stats.avg_calcium, 2),
            'iron': round(mineral_stats.avg_iron, 2),
            'sodium': round(mineral_stats.avg_sodium, 2)
        },
        'vitamin_averages': {
            'vitamin_c': round(vitamin_stats.avg_vitamin_c, 2),
            'vitamin_b11': round(vitamin_stats.avg_vitamin_b11, 2)
        }
    })

def specific_nutrient_ranking(request):
    nutrient_type = request.GET.get('nutrient', 'protein')
    order_type = request.GET.get('order', 'desc')
    limit_num = int(request.GET.get('limit', 20))
    spark = SparkSession.builder.appName("NutrientRanking").master("local[*]").getOrCreate()
    df = spark.read.option("header", "true").option("inferSchema", "true").csv("hdfs://localhost:9000/nutrition_data/cleaned_nutrition_dataset_per100g.csv")
    nutrient_mapping = {
        'protein': '蛋白质',
        'fiber': '膳食纤维',
        'calcium': '钙',
        'iron': '铁',
        'calories': '热量',
        'sodium': '钠'
    }
    target_nutrient = nutrient_mapping.get(nutrient_type, '蛋白质')
    if order_type == 'asc':
        ranked_foods = df.select("食物名称", target_nutrient).filter(col(target_nutrient).isNotNull()).orderBy(asc(target_nutrient)).limit(limit_num).collect()
    else:
        ranked_foods = df.select("食物名称", target_nutrient).filter(col(target_nutrient).isNotNull()).orderBy(desc(target_nutrient)).limit(limit_num).collect()
    nutrient_stats = df.select(
        avg(col(target_nutrient)).alias("avg_value"),
        max(col(target_nutrient)).alias("max_value"),
        min(col(target_nutrient)).alias("min_value"),
        count(col(target_nutrient)).alias("total_count")
    ).collect()[0]
    percentile_values = df.select(target_nutrient).filter(col(target_nutrient).isNotNull()).rdd.map(lambda x: x[0]).collect()
    percentile_values.sort()
    p25 = np.percentile(percentile_values, 25)
    p75 = np.percentile(percentile_values, 75)
    p90 = np.percentile(percentile_values, 90)
    top_foods_analysis = []
    for i, food in enumerate(ranked_foods[:10]):
        food_name = food['食物名称']
        nutrient_value = food[target_nutrient]
        if nutrient_value >= p90:
            level = "优秀"
        elif nutrient_value >= p75:
            level = "良好"
        elif nutrient_value >= p25:
            level = "一般"
        else:
            level = "较低"
        top_foods_analysis.append({
            'rank': i + 1,
            'food_name': food_name,
            'value': round(nutrient_value, 2),
            'level': level,
            'percentage_above_avg': round(((nutrient_value - nutrient_stats.avg_value) / nutrient_stats.avg_value) * 100, 1)
        })
    spark.stop()
    return JsonResponse({
        'nutrient_type': nutrient_type,
        'ranking_data': top_foods_analysis,
        'statistics': {
            'average': round(nutrient_stats.avg_value, 2),
            'maximum': round(nutrient_stats.max_value, 2),
            'minimum': round(nutrient_stats.min_value, 2),
            'total_foods': nutrient_stats.total_count,
            'percentiles': {
                'p25': round(p25, 2),
                'p75': round(p75, 2),
                'p90': round(p90, 2)
            }
        }
    })

def food_clustering_analysis(request):
    spark = SparkSession.builder.appName("FoodClustering").master("local[*]").getOrCreate()
    df = spark.read.option("header", "true").option("inferSchema", "true").csv("hdfs://localhost:9000/nutrition_data/cleaned_nutrition_dataset_per100g.csv")
    feature_cols = ["蛋白质", "脂肪", "碳水化合物", "膳食纤维", "钠", "糖"]
    clean_df = df.select("食物名称", *feature_cols).filter(col("蛋白质").isNotNull() & col("脂肪").isNotNull() & col("碳水化合物").isNotNull())
    assembler = VectorAssembler(inputCols=feature_cols, outputCol="features")
    feature_df = assembler.transform(clean_df)
    kmeans = KMeans(k=5, seed=42, featuresCol="features", predictionCol="cluster")
    model = kmeans.fit(feature_df)
    clustered_df = model.transform(feature_df)
    cluster_stats = clustered_df.groupBy("cluster").agg(
        count("*").alias("food_count"),
        avg("蛋白质").alias("avg_protein"),
        avg("脂肪").alias("avg_fat"),
        avg("碳水化合物").alias("avg_carbs"),
        avg("膳食纤维").alias("avg_fiber"),
        avg("钠").alias("avg_sodium"),
        avg("糖").alias("avg_sugar")
    ).orderBy("cluster").collect()
    cluster_analysis = []
    cluster_names = ["高蛋白低脂类", "高碳水主食类", "高脂高热量类", "高纤维蔬果类", "高钠加工类"]
    for i, stats in enumerate(cluster_stats):
        dominant_nutrient = max([
            ("蛋白质", stats.avg_protein),
            ("脂肪", stats.avg_fat),
            ("碳水化合物", stats.avg_carbs),
            ("膳食纤维", stats.avg_fiber)
        ], key=lambda x: x[1])
        cluster_analysis.append({
            'cluster_id': stats.cluster,
            'cluster_name': cluster_names[i] if i < len(cluster_names) else f"类别{stats.cluster + 1}",
            'food_count': stats.food_count,
            'dominant_nutrient': dominant_nutrient[0],
            'avg_nutrition': {
                'protein': round(stats.avg_protein, 2),
                'fat': round(stats.avg_fat, 2),
                'carbs': round(stats.avg_carbs, 2),
                'fiber': round(stats.avg_fiber, 2),
                'sodium': round(stats.avg_sodium, 2),
                'sugar': round(stats.avg_sugar, 2)
            }
        })
    representative_foods = []
    for cluster_id in range(5):
        cluster_foods = clustered_df.filter(col("cluster") == cluster_id).select("食物名称", "蛋白质", "脂肪", "碳水化合物").limit(5).collect()
        representative_foods.append({
            'cluster_id': cluster_id,
            'foods': [{'name': food['食物名称'], 'protein': food['蛋白质'], 'fat': food['脂肪'], 'carbs': food['碳水化合物']} for food in cluster_foods]
        })
    centers = model.clusterCenters()
    cluster_centers = []
    for i, center in enumerate(centers):
        cluster_centers.append({
            'cluster_id': i,
            'center_values': [round(float(val), 2) for val in center]
        })
    spark.stop()
    return JsonResponse({
        'cluster_analysis': cluster_analysis,
        'representative_foods': representative_foods,
        'cluster_centers': cluster_centers,
        'feature_columns': feature_cols,
        'total_clustered_foods': sum([cluster['food_count'] for cluster in cluster_analysis])
    })

基于大数据的食物营养数据可视化分析系统-结语

🌟 欢迎:点赞 👍 收藏 ⭐ 评论 📝

👇🏻 精选专栏推荐 👇🏻 欢迎订阅关注!

大数据实战项目

PHP|C#.NET|Golang实战项目

微信小程序|安卓实战项目

Python实战项目

Java实战项目

🍅 ↓↓主页获取源码联系↓↓🍅