💖💖作者:计算机毕业设计小途 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目
@TOC
基于大数据的豆瓣高分电影数据可视化分析系统介绍
《基于大数据的豆瓣高分电影数据可视化分析系统》是一套采用先进大数据技术栈构建的电影数据挖掘与可视化分析平台,系统底层基于Hadoop分布式存储框架和Spark大数据处理引擎,通过HDFS实现海量豆瓣电影数据的分布式存储,利用Spark SQL进行高效的数据查询与分析,结合Pandas和NumPy等数据科学库完成复杂的数据预处理和统计计算。系统采用前后端分离架构,后端支持Django和Spring Boot两套技术方案,前端基于Vue框架结合ElementUI组件库构建现代化用户界面,通过Echarts图表库实现丰富的数据可视化效果,整体界面使用HTML、CSS、JavaScript和jQuery技术确保良好的用户交互体验,数据持久化采用MySQL关系型数据库。系统核心功能涵盖电影特征可视化分析、电影类型内容分析、电影制作产业分析、影人影响力可视化分析以及观众平台覆盖率分析等五大数据挖掘模块,通过大屏可视化展示为用户提供直观的数据洞察,同时配备完善的用户管理体系包括个人信息管理、密码修改、系统介绍等基础功能模块,整个系统充分体现了大数据技术在影视数据分析领域的实际应用价值。
基于大数据的豆瓣高分电影数据可视化分析系统演示视频
基于大数据的豆瓣高分电影数据可视化分析系统演示图片
基于大数据的豆瓣高分电影数据可视化分析系统代码展示
spark = SparkSession.builder.appName("DoubanMovieAnalysis").config("spark.sql.adaptive.enabled", "true").config("spark.sql.adaptive.coalescePartitions.enabled", "true").getOrCreate()
def analyze_movie_features():
movie_df = spark.read.option("header", "true").csv("hdfs://localhost:9000/douban/movies.csv")
movie_df.createOrReplaceTempView("movies")
rating_stats = spark.sql("SELECT rating_range, COUNT(*) as movie_count, AVG(rating) as avg_rating FROM (SELECT *, CASE WHEN rating >= 9.0 THEN '9.0+' WHEN rating >= 8.0 THEN '8.0-8.9' WHEN rating >= 7.0 THEN '7.0-7.9' WHEN rating >= 6.0 THEN '6.0-6.9' ELSE '6.0以下' END as rating_range FROM movies WHERE rating IS NOT NULL) GROUP BY rating_range ORDER BY avg_rating DESC")
year_trend = spark.sql("SELECT release_year, AVG(rating) as avg_rating, COUNT(*) as movie_count, AVG(vote_count) as avg_votes FROM movies WHERE release_year BETWEEN 2000 AND 2023 AND rating IS NOT NULL GROUP BY release_year ORDER BY release_year")
duration_analysis = spark.sql("SELECT CASE WHEN duration <= 90 THEN '短片(≤90分钟)' WHEN duration <= 120 THEN '标准(91-120分钟)' WHEN duration <= 150 THEN '长片(121-150分钟)' ELSE '超长片(>150分钟)' END as duration_category, COUNT(*) as count, AVG(rating) as avg_rating FROM movies WHERE duration IS NOT NULL GROUP BY duration_category ORDER BY avg_rating DESC")
country_stats = spark.sql("SELECT country, COUNT(*) as movie_count, AVG(rating) as avg_rating, AVG(vote_count) as avg_popularity FROM movies WHERE country IS NOT NULL AND country != '' GROUP BY country HAVING COUNT(*) >= 10 ORDER BY avg_rating DESC LIMIT 20")
language_distribution = spark.sql("SELECT language, COUNT(*) as count, AVG(rating) as avg_rating FROM movies WHERE language IS NOT NULL GROUP BY language HAVING COUNT(*) >= 5 ORDER BY count DESC")
high_rating_features = spark.sql("SELECT AVG(duration) as avg_duration, AVG(vote_count) as avg_votes, COUNT(DISTINCT country) as country_diversity FROM movies WHERE rating >= 8.5")
rating_vote_correlation = spark.sql("SELECT CORR(rating, LOG(vote_count + 1)) as correlation FROM movies WHERE rating IS NOT NULL AND vote_count > 0")
monthly_release = spark.sql("SELECT MONTH(STR_TO_DATE(release_date, 'yyyy-MM-dd')) as release_month, COUNT(*) as release_count, AVG(rating) as avg_rating FROM movies WHERE release_date IS NOT NULL GROUP BY release_month ORDER BY release_month")
feature_results = {'rating_distribution': rating_stats.collect(), 'year_trend': year_trend.collect(), 'duration_analysis': duration_analysis.collect(), 'country_stats': country_stats.collect(), 'language_stats': language_distribution.collect(), 'high_rating_features': high_rating_features.collect(), 'correlation': rating_vote_correlation.collect(), 'monthly_release': monthly_release.collect()}
return feature_results
def analyze_movie_genres():
movie_df = spark.read.option("header", "true").csv("hdfs://localhost:9000/douban/movies.csv")
movie_df.createOrReplaceTempView("movies")
exploded_genres = spark.sql("SELECT movie_id, title, rating, vote_count, release_year, TRIM(genre_item) as genre FROM movies LATERAL VIEW explode(split(genres, '/')) genreTable AS genre_item WHERE genre_item IS NOT NULL AND genre_item != ''")
exploded_genres.createOrReplaceTempView("movie_genres")
genre_popularity = spark.sql("SELECT genre, COUNT(*) as movie_count, AVG(rating) as avg_rating, AVG(vote_count) as avg_popularity, MAX(rating) as max_rating, MIN(rating) as min_rating FROM movie_genres GROUP BY genre HAVING COUNT(*) >= 10 ORDER BY movie_count DESC")
genre_evolution = spark.sql("SELECT genre, release_year, COUNT(*) as yearly_count, AVG(rating) as yearly_avg_rating FROM movie_genres WHERE release_year BETWEEN 2000 AND 2023 GROUP BY genre, release_year HAVING COUNT(*) >= 3 ORDER BY genre, release_year")
genre_combinations = spark.sql("SELECT g1.genre as genre1, g2.genre as genre2, COUNT(*) as combination_count, AVG(g1.rating) as avg_rating FROM movie_genres g1 JOIN movie_genres g2 ON g1.movie_id = g2.movie_id WHERE g1.genre < g2.genre GROUP BY g1.genre, g2.genre HAVING COUNT(*) >= 5 ORDER BY combination_count DESC LIMIT 15")
high_rating_genres = spark.sql("SELECT genre, COUNT(*) as high_rating_count, (COUNT(*) * 100.0 / (SELECT COUNT(*) FROM movie_genres mg2 WHERE mg2.genre = mg1.genre)) as percentage FROM movie_genres mg1 WHERE rating >= 8.0 GROUP BY genre HAVING COUNT(*) >= 5 ORDER BY percentage DESC")
genre_vote_analysis = spark.sql("SELECT genre, PERCENTILE_APPROX(vote_count, 0.5) as median_votes, PERCENTILE_APPROX(vote_count, 0.9) as p90_votes, AVG(vote_count) as avg_votes FROM movie_genres GROUP BY genre HAVING COUNT(*) >= 10 ORDER BY median_votes DESC")
seasonal_genre_trends = spark.sql("SELECT genre, QUARTER(STR_TO_DATE(CONCAT(release_year, '-01-01'), 'yyyy-MM-dd')) as release_quarter, COUNT(*) as count FROM movie_genres WHERE release_year IS NOT NULL GROUP BY genre, release_quarter HAVING COUNT(*) >= 3 ORDER BY genre, release_quarter")
genre_rating_distribution = spark.sql("SELECT genre, CASE WHEN rating >= 8.5 THEN '优秀' WHEN rating >= 7.5 THEN '良好' WHEN rating >= 6.5 THEN '一般' ELSE '较差' END as rating_level, COUNT(*) as count FROM movie_genres GROUP BY genre, rating_level ORDER BY genre, rating_level")
top_movies_by_genre = spark.sql("SELECT genre, title, rating, vote_count, ROW_NUMBER() OVER (PARTITION BY genre ORDER BY rating DESC, vote_count DESC) as rank FROM movie_genres WHERE rating IS NOT NULL").filter("rank <= 3")
genre_results = {'popularity': genre_popularity.collect(), 'evolution': genre_evolution.collect(), 'combinations': genre_combinations.collect(), 'high_rating': high_rating_genres.collect(), 'vote_analysis': genre_vote_analysis.collect(), 'seasonal_trends': seasonal_genre_trends.collect(), 'rating_distribution': genre_rating_distribution.collect(), 'top_movies': top_movies_by_genre.collect()}
return genre_results
def analyze_celebrity_influence():
movie_df = spark.read.option("header", "true").csv("hdfs://localhost:9000/douban/movies.csv")
celebrity_df = spark.read.option("header", "true").csv("hdfs://localhost:9000/douban/celebrities.csv")
movie_df.createOrReplaceTempView("movies")
celebrity_df.createOrReplaceTempView("celebrities")
director_influence = spark.sql("SELECT c.name as director_name, COUNT(m.movie_id) as directed_count, AVG(m.rating) as avg_rating, AVG(m.vote_count) as avg_popularity, SUM(m.vote_count) as total_votes, MAX(m.rating) as best_rating FROM movies m JOIN celebrities c ON m.director_id = c.celebrity_id WHERE m.rating IS NOT NULL GROUP BY c.name, c.celebrity_id HAVING COUNT(m.movie_id) >= 3 ORDER BY avg_rating DESC, directed_count DESC LIMIT 20")
actor_performance = spark.sql("SELECT c.name as actor_name, COUNT(DISTINCT m.movie_id) as movie_count, AVG(m.rating) as avg_movie_rating, AVG(m.vote_count) as avg_popularity, COUNT(CASE WHEN m.rating >= 8.0 THEN 1 END) as high_rating_movies FROM celebrities c JOIN movie_actors ma ON c.celebrity_id = ma.actor_id JOIN movies m ON ma.movie_id = m.movie_id WHERE m.rating IS NOT NULL GROUP BY c.name, c.celebrity_id HAVING COUNT(DISTINCT m.movie_id) >= 5 ORDER BY avg_movie_rating DESC LIMIT 25")
collaboration_analysis = spark.sql("SELECT d.name as director, a.name as actor, COUNT(*) as collaboration_count, AVG(m.rating) as avg_collaboration_rating, AVG(m.vote_count) as avg_popularity FROM movies m JOIN celebrities d ON m.director_id = d.celebrity_id JOIN movie_actors ma ON m.movie_id = ma.movie_id JOIN celebrities a ON ma.actor_id = a.celebrity_id GROUP BY d.name, a.name, d.celebrity_id, a.celebrity_id HAVING COUNT(*) >= 2 ORDER BY collaboration_count DESC, avg_collaboration_rating DESC LIMIT 15")
career_evolution = spark.sql("SELECT c.name, m.release_year, COUNT(*) as yearly_movies, AVG(m.rating) as yearly_avg_rating, AVG(m.vote_count) as yearly_popularity FROM celebrities c JOIN movies m ON c.celebrity_id = m.director_id WHERE m.release_year BETWEEN 2000 AND 2023 GROUP BY c.name, c.celebrity_id, m.release_year HAVING COUNT(*) >= 1 ORDER BY c.name, m.release_year")
genre_specialization = spark.sql("SELECT c.name, TRIM(genre_item) as specialized_genre, COUNT(*) as genre_count, AVG(m.rating) as genre_avg_rating FROM celebrities c JOIN movies m ON c.celebrity_id = m.director_id LATERAL VIEW explode(split(m.genres, '/')) genreTable AS genre_item WHERE genre_item IS NOT NULL GROUP BY c.name, c.celebrity_id, specialized_genre HAVING COUNT(*) >= 2 ORDER BY c.name, genre_count DESC")
influence_metrics = spark.sql("SELECT c.name, COUNT(DISTINCT m.movie_id) as total_works, AVG(m.rating) as influence_rating, SUM(m.vote_count) as total_audience_reach, MAX(m.vote_count) as peak_popularity, STDDEV(m.rating) as rating_consistency FROM celebrities c JOIN movies m ON c.celebrity_id = m.director_id OR c.celebrity_id IN (SELECT actor_id FROM movie_actors WHERE movie_id = m.movie_id) GROUP BY c.name, c.celebrity_id HAVING COUNT(DISTINCT m.movie_id) >= 3 ORDER BY total_audience_reach DESC LIMIT 30")
award_correlation = spark.sql("SELECT c.name, COUNT(CASE WHEN m.rating >= 8.5 THEN 1 END) as masterpiece_count, COUNT(CASE WHEN m.vote_count >= 100000 THEN 1 END) as popular_works, (COUNT(CASE WHEN m.rating >= 8.5 THEN 1 END) * 1.0 / COUNT(*)) as masterpiece_ratio FROM celebrities c JOIN movies m ON c.celebrity_id = m.director_id GROUP BY c.name, c.celebrity_id HAVING COUNT(*) >= 5 ORDER BY masterpiece_ratio DESC, masterpiece_count DESC")
international_reach = spark.sql("SELECT c.name, COUNT(DISTINCT m.country) as countries_worked, STRING_AGG(DISTINCT m.country, ', ') as country_list, AVG(m.rating) as international_avg_rating FROM celebrities c JOIN movies m ON c.celebrity_id = m.director_id WHERE m.country IS NOT NULL GROUP BY c.name, c.celebrity_id HAVING COUNT(DISTINCT m.country) >= 2 ORDER BY countries_worked DESC")
celebrity_results = {'director_influence': director_influence.collect(), 'actor_performance': actor_performance.collect(), 'collaborations': collaboration_analysis.collect(), 'career_evolution': career_evolution.collect(), 'specialization': genre_specialization.collect(), 'influence_metrics': influence_metrics.collect(), 'award_correlation': award_correlation.collect(), 'international_reach': international_reach.collect()}
return celebrity_results
基于大数据的豆瓣高分电影数据可视化分析系统文档展示
💖💖作者:计算机毕业设计小途 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目