【数据分析】基于大数据的旅游上榜景点及评论数据可视化分析系统 | 大数据毕设选题推荐 大数据实战项目 可视化大屏 Hadoop SPark Django

49 阅读5分钟

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

基于大数据的旅游上榜景点及评论数据可视化分析系统介绍

本系统全称为《基于大数据的旅游上榜景点及评论数据可视化分析系统》,它是一个整合了大数据处理与Web可视化技术的综合性毕业设计项目。系统后端技术栈以Java为主,采用业界主流的SpringBoot框架搭建,通过Mybatis实现与MySQL数据库的交互,确保了系统的稳定性和可扩展性。其核心亮点在于数据处理层,系统并未采用传统的单体应用处理模式,而是引入了强大的Apache Spark分布式计算框架。它能够高效地从Hadoop的HDFS分布式文件系统中读取海量的、非结构化的旅游景点评论源数据,并利用Spark SQL进行并行化、内存级的计算与聚合分析,例如实现对上百万条评论数据的词频统计、情感倾向分析、景点热度排行计算等。前端界面则采用Vue.js作为核心框架,配合ElementUI组件库快速构建用户交互界面,所有经过Spark分析处理后的数据,最终都通过Echarts图表库,以动态、直观的柱状图、饼图、词云图、地理热力图等多种可视化形式清晰地呈现在Web页面上。系统整体实现了从海量数据存储、分布式处理分析到前端可视化展现的完整大数据业务流程,主要涵盖了系统首页数据概览、多维度数据可视化分析、基础的系统管理和用户信息管理等功能模块,旨在为毕业设计提供一个技术栈先进、功能完整的实践范例。

基于大数据的旅游上榜景点及评论数据可视化分析系统演示视频

演示视频

基于大数据的旅游上榜景点及评论数据可视化分析系统演示图片

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

基于大数据的旅游上榜景点及评论数据可视化分析系统代码展示

// 假设SparkSession已通过Spring注入,这里直接使用
// import org.apache.spark.sql.SparkSession;
// import org.apache.spark.sql.Dataset;
// import org.apache.spark.sql.Row;
// import static org.apache.spark.sql.functions.*;
SparkSession spark = SparkSession.builder()
        .appName("TourismDataAnalysis")
        .master("local[*]") // 在实际集群环境中会配置为YARN或K8s
        .getOrCreate();
// 1. 核心功能一:获取景点评论词云图数据
// 该函数负责读取HDFS上的评论数据,进行分词和词频统计,返回频率最高的N个词
public List<Map<String, Object>> getWordCloudData(String spotId) {
    String hdfsPath = "hdfs://namenode:9000/tourism_data/reviews.txt";
    Dataset<Row> reviewsDF = spark.read().option("header", "true").csv(hdfsPath).filter(col("spot_id").equalTo(spotId));
    // 假设评论在"content"列,这里使用一个简单的空格分词
    Dataset<Row> wordsDF = reviewsDF.select(explode(split(col("content"), " ")).as("word"));
    // 过滤掉一些无意义的词或标点符号
    Dataset<Row> filteredWords = wordsDF.filter(length(col("word")).gt(1));
    // 进行词频统计
    Dataset<Row> wordCounts = filteredWords.groupBy("word").count();
    // 按词频降序排序,并取前100个词
    Dataset<Row> topWords = wordCounts.orderBy(col("count").desc()).limit(100);
    List<Row> resultRows = topWords.collectAsList();
    List<Map<String, Object>> wordCloudList = new ArrayList<>();
    for (Row row : resultRows) {
        Map<String, Object> wordMap = new HashMap<>();
        wordMap.put("name", row.getString(0));
        wordMap.put("value", row.getLong(1));
        wordCloudList.add(wordMap);
    }
    return wordCloudList;
}
// 2. 核心功能二:分析景点评论情感正负面比例
// 该函数通过关键词匹配来做一个简单的正负面情感分析,并统计比例
public Map<String, Double> getSentimentRatio(String spotId) {
    String hdfsPath = "hdfs://namenode:9000/tourism_data/reviews.csv";
    Dataset<Row> reviewsDF = spark.read().option("header", "true").csv(hdfsPath).filter(col("spot_id").equalTo(spotId));
    // 定义正负面关键词列表
    List<String> positiveWords = Arrays.asList("推荐", "漂亮", "好玩", "满意", "不错");
    List<String> negativeWords = Arrays.asList("失望", "差评", "坑", "不会再来", "糟糕");
    // 使用UDF(用户自定义函数)来判断情感
    spark.udf().register("sentiment_udf", (String content) -> {
        for (String word : positiveWords) {
            if (content.contains(word)) return "positive";
        }
        for (String word : negativeWords) {
            if (content.contains(word)) return "negative";
        }
        return "neutral";
    }, DataTypes.StringType);
    Dataset<Row> sentimentDF = reviewsDF.withColumn("sentiment", callUDF("sentiment_udf", col("content")));
    Dataset<Row> sentimentCounts = sentimentDF.groupBy("sentiment").count();
    long total = sentimentDF.count();
    Map<String, Double> ratioMap = new HashMap<>();
    List<Row> resultRows = sentimentCounts.collectAsList();
    for (Row row : resultRows) {
        String sentiment = row.getString(0);
        long count = row.getLong(1);
        ratioMap.put(sentiment, (double) count / total);
    }
    return ratioMap;
}
// 3. 核心功能三:计算并获取评分最高的Top10景点
// 该函数负责计算所有景点的平均分,并返回评分最高的10个
public List<Map<String, Object>> getTopRatedSpots() {
    String hdfsPath = "hdfs://namenode:9000/tourism_data/reviews.csv";
    // 读取数据,假设包含 spot_name 和 rating 两列
    Dataset<Row> reviewsDF = spark.read().option("header", "true").csv(hdfsPath);
    // 将评分列转换为数值类型
    Dataset<Row> typedDF = reviewsDF.withColumn("rating_val", col("rating").cast(DataTypes.DoubleType));
    // 按景点名称分组,计算平均分和评论数
    Dataset<Row> aggregatedDF = typedDF.groupBy("spot_name")
            .agg(
                    avg("rating_val").as("avg_rating"),
                    count("rating_val").as("review_count")
            );
    // 过滤掉评论数少于50条的景点,避免偶然性高分
    Dataset<Row> filteredDF = aggregatedDF.filter(col("review_count").gt(50));
    // 按平均分降序排序,取前10名
    Dataset<Row> topSpotsDF = filteredDF.orderBy(col("avg_rating").desc()).limit(10);
    List<Row> resultRows = topSpotsDF.collectAsList();
    List<Map<String, Object>> topSpotsList = new ArrayList<>();
    for (Row row : resultRows) {
        Map<String, Object> spotMap = new HashMap<>();
        spotMap.put("spotName", row.getString(0));
        spotMap.put("averageRating", row.getDouble(1));
        spotMap.put("reviewCount", row.getLong(2));
        topSpotsList.add(spotMap);
    }
    return topSpotsList;

基于大数据的旅游上榜景点及评论数据可视化分析系统文档展示

在这里插入图片描述

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