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