尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

电影票房大数据分析可视化:从Python爬虫到Spark SQL完整实战

电影票房大数据分析可视化:从Python爬虫到Spark SQL完整实战 前几天有同学问起计算机毕业设计选题想找一个既能体现大数据技术栈又不会过于空洞的方向。聊来聊去电影票房数据分析与可视化这个题目确实很适合用来做系统化实战。它既包含 Python 爬虫采集也涉及 Hadoop 分布式存储、Hive 数据建模、Spark 分布式计算最后还有 Flask ECharts 可视化展示。一个项目把采集、存储、计算、展示整条链路全部串起来课程设计、毕业设计、答辩演示都能用上。本文就以这个项目为背景完整拆解一套可落地的实现方案。文章会从项目背景、系统设计、环境准备开始逐步讲清楚爬虫模块、HDFS 与 Hive 数据存储、Spark SQL 数据分析、可视化展示以及常见的排查思路和答辩关注点。无论你目前只是听过 Python 爬虫还是已经接触过 Hadoop、Spark 但没做过完整项目都可以跟着这篇文章把主链路跑通。1. 项目背景与选题价值1.1 为什么电影票房分析适合作为毕设选题影视行业每天都会产生大量数据包括电影评分、票房、上映日期、导演、演员、类型标签、地区等。这些数据来自不同平台格式不统一信息密度高非常适合用大数据技术进行处理和分析。相比传统的图书管理系统、学生管理系统这类 CRUD 毕设电影票房数据分析项目能更直观地展示大数据处理的价值。从技术角度来说这个题目能覆盖完整的数据生命周期数据采集Python 爬虫从公开网站抓取电影榜单和基础信息。数据存储数据文件上传到 Hadoop HDFS。数据建模使用 Hive 建立外部表将半结构化文本转成可查询的数据表。数据分析使用 Spark SQL 完成聚合、关联、统计等计算。数据可视化通过 Flask 提供接口前端使用 ECharts 绘制图表。对本科生来说这个项目规模适中既有一定技术深度又不会难到无法完成。对研究生或者想做进阶项目的同学也可以在现有基础上扩展推荐算法、票房预测模型、实时流处理等内容。1.2 项目能锻炼哪些核心能力这个选题最大的优点不是“新技术多”而是能让你完整经历一个大数据项目的开发流程。完成之后你至少能掌握以下几项能力使用 requests 和 BeautifulSoup 编写爬虫并理解反爬、频率控制、数据清洗等工程细节。掌握 Hadoop HDFS 的基本命令理解分布式文件系统在数据存储中的作用。理解 Hive 外部表、内部表、CSV SerDe 的概念能够通过 HiveQL 做数据查询和检查。掌握 Spark SQL 的 DataFrame 操作能够完成 join、groupBy、聚合和结果输出。能用 Flask 编写简单接口并通过 ECharts 制作柱状图、折线图、饼图。在论文和答辩中能阐述清楚每个模块的选型原因和整体数据流。1.3 几个关键术语先理清在开始搭建之前先明确几个会反复出现的术语Python 爬虫通过编写程序自动请求网页并提取数据的过程。常用库包括 requests、BeautifulSoup、lxml 等。Hadoop一套开源分布式基础架构核心包括 HDFS分布式文件系统和 YARN资源调度。Hive构建在 Hadoop 之上的数据仓库工具可以用 SQL 方式查询存储在 HDFS 上的数据。Spark分布式计算引擎基于内存计算适合迭代式数据处理。Spark SQL 是其中用于结构化数据处理的模块。大数据分析区别于单机处理的数据分析方式通常需要将数据分散存储到多台机器并对数据进行并行计算。2. 系统总体设计2.1 功能模块划分整个电影票房数据分析与可视化系统可以拆成以下几个模块模块核心职责使用技术数据采集模块抓取公开电影榜单和电影信息Python、requests、BeautifulSoup数据清洗模块去重、过滤无效数据、统一格式pandas数据存储模块存储原始 CSV 和分析结果Hadoop HDFS、MySQL数据建模模块将 CSV 映射成 Hive 表Hive数据分析模块统计评分、票房、类型分布等指标Spark SQL数据可视化模块展示分析结果Flask、ECharts每个模块之间尽量解耦。爬虫只管产出 CSV 文件Hive 任务只管建表Spark 任务只管计算可视化模块通过读取 MySQL 里的统计结果完成展示。这样即使某一步出现问题也只需要定位局部模块不用把整个系统重新跑一遍。2.2 数据流程设计下面用文字描述完整的数据流转过程这也是后面各章的实现主线。通过 Python 爬虫从公开电影榜单页面抓取电影基础信息保存为 CSV 文件。使用 pandas 对 CSV 做去重、字段缺失值过滤、年份格式统一等操作。将清洗后的 CSV 上传到 Hadoop HDFS 指定目录。在 Hive 中创建外部表指向 HDFS 中的 CSV 文件。使用 Spark SQL 从 Hive 表读取数据完成关联和聚合统计分析。将分析结果通过 JDBC 写入 MySQL 数据库。Flask 后端查询 MySQL 并返回 JSON 数据。前端 ECharts 根据 JSON 数据绘制柱状图、折线图、饼图。这种流程会让人产生一个很自然的疑问数据量明明不大为什么非要引入 Hadoop 和 Spark这里需要注意毕业设计的核心是“完整展示大数据分析技术栈的应用”。即使数据量只有几千条整套流程也是按分布式思路设计的。后续如果接入更大的数据集比如某平台十年的电影票房数据就可以通过扩展集群节点来提升处理能力。2.3 技术选型说明为什么选择 Python 而不是 Java 做爬虫因为 Python 生态中 requests、BeautifulSoup、pandas 等库使用门槛低代码简洁处理 CSV 和文本数据非常方便。为什么引入 Hadoop因为项目标题明确要求掌握数据处理能力HDFS 是大数据存储的基础组件。使用 HDFS 存储原始文件可以让数据层与计算层分离后续即使计算任务变更原始数据仍然保留在分布式文件系统中。为什么使用 Spark 而不是直接写 MapReduceMapReduce 编程模型较繁琐中间结果频繁落盘迭代计算效率低。Spark SQL 提供 DataFrame API 和 SQL 方式开发效率高适合本项目的聚合计算。实际分布式集群中Spark 也是更主流的计算框架。2.4 项目工程目录规划建议提前创建一个清晰的工程目录避免所有文件都堆在同一个目录里。下面是我的推荐结构movie-analysis/ ├── data/ │ ├── raw/ │ ├── clean/ │ └── output/ ├── src/ │ ├── spider/ │ ├── analysis/ │ └── web/ ├── sql/ ├── docs/ └── requirements.txt3. 环境准备与版本说明3.1 Python 环境本项目示例代码以 Python 3.8 为准建议使用 virtualenv 或 conda 创建独立虚拟环境避免依赖冲突。需要安装的 Python 库如下pip install requests beautifulsoup4 lxml pandas flask pymysql如果你的开发机还要运行 Jupyter Notebook可以再安装 jupyter。3.2 Hadoop、Hive、Spark 环境大数据组件的版本组合需要特别注意。不同版本的 Hadoop、Hive、Spark 之间存在兼容性问题建议优先使用同一套发行版例如 CDH 或 HDP 的成套环境。如果采用 Apache 原生组件常见组合是 Hadoop 3.x Hive 3.x Spark 3.x但具体版本仍要以官方兼容矩阵为准。对于毕业设计我建议采用以下两种方案之一方案 A使用配置好的 Linux 虚拟机镜像。很多大数据课程会提供 CentOS 环境下的 Hadoop、Hive、Spark 一体化镜像优点是省去集群部署时间适合把主要精力放在业务代码上。方案 B使用 Docker 容器搭建 Hadoop、Hive、Spark 环境。Docker 方式相对轻量环境隔离好但需要额外理解容器、端口映射、数据卷挂载等概念。需要注意不建议直接在 Windows 系统上部署完整 Hadoop。HDFS 在 Windows 上运行会遇到许多本地文件系统兼容问题例如NativeIO$Windows相关报错。更稳妥的做法是开发机用 Windows 编写代码大数据组件的运行环境放在 Linux 虚拟机或云服务器上。3.3 MySQL 环境MySQL 负责存储 Spark 分析后的统计结果。本地安装 MySQL 8.0 即可版本 5.7 也没有问题。需要提前创建项目和用户并保证 Spark 所在机器能通过网络访问 MySQL。推荐建库语句CREATE DATABASE IF NOT EXISTS movie_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;使用 utf8mb4 而不是 utf8避免后续写入中文时出现乱码。3.4 版本配置提醒本文中的代码和命令以常见环境为例重点是演示实现思路。实际部署时请根据你自己的组件版本调整安装方式、依赖 jar 和连接参数。写论文时也要注意记录当前使用的版本组合这属于系统开发环境部分的基础内容。4. 数据采集模块设计与实现4.1 数据源分析与合规说明爬虫部分要考虑两个问题爬什么去哪爬。示例代码选择豆瓣电影 Top250 页面作为演示数据源因为它公开访问、页面结构稳定、字段包含电影名、评分、导演、年份、地区、类型等信息非常适合练习。但豆瓣 Top250 本身不直接提供票房字段因此本项目在演示时会把“票房”作为扩展数据表处理。你可以根据实际开题方向将数据源替换为公开可访问的票房榜单页面或者使用公开 API 和手工整理的数据表。这里要特别强调合规性爬虫仅用于学习研究和毕业设计演示抓取频率要克制不要高并发请求遵守目标网站的 robots 协议和用户协议涉及登录态、商业数据接口的页面不要强行爬取。论文中最好也加入一段“数据来源与合规说明”这在答辩时是加分项。4.2 爬虫核心代码下面给出一个可运行的爬虫示例。它负责抓取豆瓣电影 Top250 的前 10 页数据并提取常见基础字段。# 文件路径src/spider/douban_top250.py import re import time import pandas as pd import requests from bs4 import BeautifulSoup HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } def fetch_page(url): resp requests.get(url, headersHEADERS, timeout10) resp.encoding utf-8 if resp.status_code ! 200: print(请求失败状态码, resp.status_code) return None return resp.text def parse_page(html): soup BeautifulSoup(html, lxml) rows [] for item in soup.select(.grid_view .item): rank item.select_one(.pic em).text.strip() title item.select_one(.title).text.strip() rating item.select_one(.rating_num).text.strip() comment_info item.select_one(.star span).text.strip() quote_tag item.select_one(.inq) quote quote_tag.text.strip() if quote_tag else info item.select_one(.bd p).text.strip() director director_match re.findall(r导演:\s*([^\n]), info) if director_match: director director_match[0].strip() year_region_genre info_lines info.split(\n) if len(info_lines) 1: year_region_genre info_lines[1].strip() parts [p.strip().replace((, ).replace(), ) for p in year_region_genre.split( / )] year parts[0] if len(parts) 0 else region parts[1] if len(parts) 1 else genre parts[2] if len(parts) 2 else rows.append({ rank: rank, title: title, rating: rating, comments: comment_info, quote: quote, director: director, year: year, region: region, genre: genre }) return rows def main(): all_rows [] for start in range(0, 250, 25): url fhttps://movie.douban.com/top250?start{start}filter print(抓取 url) html fetch_page(url) if html: all_rows.extend(parse_page(html)) time.sleep(2) df pd.DataFrame(all_rows) df.to_csv(../../data/raw/douban_top250.csv, indexFalse, encodingutf-8-sig) print(抓取完成共, len(df), 条数据) if __name__ __main__: main()这段代码有几个细节值得注意User-Agent 必须设置否则部分服务器会直接拒绝请求。每抓取一页后time.sleep(2)控制请求频率。使用 pandas 导出 CSV 时指定encodingutf-8-sig避免 Excel 打开后中文乱码。解析年份、地区、类型时先按\n切分文本再按/切分这是豆瓣页面常见的结构。4.3 数据清洗与扩展数据准备爬虫得到的数据往往存在缺失、类型不对、重复等问题。下一步用 pandas 做基础清洗。# 文件路径src/spider/clean_data.py import pandas as pd df pd.read_csv(../../data/raw/douban_top250.csv) df df.drop_duplicates(subset[title]) df df.dropna(subset[rating, title]) df[year] pd.to_numeric(df[year], errorscoerce) df df[df[year].notna()] df[rating] pd.to_numeric(df[rating], errorscoerce) df df[df[rating].notna()] df.to_csv(../../data/clean/douban_top250_clean.csv, indexFalse, encodingutf-8-sig) print(df.head()) print(df.info())如果你已经拿到了公开票房数据例如包含电影名、上映年份、票房数字的 CSV同样放在data/clean/目录下。字段建议包含movie_name, box_office, release_year。这样后续 Spark 分析时可以将电影基础信息表和票房表按电影名与年份关联起来。5. 数据存储与预处理HDFS Hive5.1 上传清洗后的 CSV 到 HDFS将本地 CSV 上传到 HDFS 之前先在 HDFS 上创建目录。后面的命令假设你已经启动了 Hadoop 相关服务。hdfs dfs -mkdir -p /movie/input hdfs dfs -put data/clean/douban_top250_clean.csv /movie/input/ hdfs dfs -put data/clean/box_office.csv /movie/input/ hdfs dfs -ls /movie/input/为什么要把文件放在 HDFS 而不是让 Hive 直接读取本地文件因为 Hive 底层运行在分布式环境中它的表数据通常需要存储在 HDFS 上。这样集群中每一台机器都能通过 DataNode 读取数据。如果用本地文件方式很可能出现某台节点读取不到文件路径的奇怪问题。5.2 Hive 建表在 Hive 中创建数据库和外部表。这里使用 OpenCSVSerde 处理 CSV 中的引号和逗号。CREATE DATABASE IF NOT EXISTS movie_db; USE movie_db; CREATE EXTERNAL TABLE IF NOT EXISTS movie_info ( rank INT, title STRING, rating DOUBLE, comments STRING, quote STRING, director STRING, year INT, region STRING, genre STRING ) ROW FORMAT SERDE org.apache.hadoop.hive.serde2.OpenCSVSerde STORED AS TEXTFILE LOCATION /movie/input;再创建票房表CREATE EXTERNAL TABLE IF NOT EXISTS box_office ( movie_name STRING, box_office DOUBLE, release_year INT ) ROW FORMAT SERDE org.apache.hadoop.hive.serde2.OpenCSVSerde STORED AS TEXTFILE LOCATION /movie/input;这里使用EXTERNAL TABLE意味着 Hive 只管理表结构不管理底层数据文件。当删除表时HDFS 上的文件仍然保留。对毕业设计而言外部表更安全因为原始数据不会因为误操作而丢失。5.3 数据质量检查建完表后用 Hive SQL 做一次快速检查。SELECT COUNT(*) AS total_cnt, COUNT(DISTINCT title) AS distinct_title, MAX(year) AS max_year, MIN(year) AS min_year FROM movie_db.movie_info;如果查询结果不符合预期常见的排查方向包括HDFS 路径是否正确、CSV 中是否存在空行、分隔符是否被识别、字段类型是否匹配。注意如果 CSV 文件的某一行字段数量与实际建表字段数不一致Hive 查询时会出现 NULL 值。6. Spark SQL 数据分析模块6.1 为什么用 Spark SQL 而不是直接写 MapReduce先想一个问题在电影数据分析中我们需要计算各类型电影的平均评分按年份统计电影产量以及关联电影评分和票房数据。这类需求本质上都是过滤、聚合、关联操作。MapReduce 可以实现但每个操作都涉及 Map 和 Reduce 阶段的反复落盘开发效率和执行效率都不理想。Spark SQL 的优势在于提供了 DataFrame 这样的高层抽象开发者可以用类似 SQL 的语法完成数据处理。它会把查询计划转换成 RDD 上的执行计划充分利用内存计算能力。框架集成章节里我们会直接用 SparkSession 读取 Hive 表这比逐行写 MapReduce 要简洁得多。6.2 Spark 读取 Hive 表并完成关联统计开发 Spark 分析任务时先确认 Spark 环境是否开启了 Hive 支持。如果后续读 Hive 表失败大概率是因为enableHiveSupport()没有设置或者缺少hive-site.xml配置。# 文件路径src/analysis/movie_analysis.py from pyspark.sql import SparkSession from pyspark.sql.functions import avg, count, desc, round spark SparkSession.builder \ .appName(MovieBoxOfficeAnalysis) \ .enableHiveSupport() \ .getOrCreate() # 读取 Hive 表 movie_df spark.sql(SELECT title, rating, year, genre, director FROM movie_db.movie_info) box_df spark.sql(SELECT movie_name, box_office, release_year FROM movie_db.box_office) # 按电影名和年份关联 join_df movie_df.join( box_df, (movie_df.title box_df.movie_name) (movie_df.year box_df.release_year), inner ) # 按类型统计电影数量、平均评分、平均票房 result join_df.groupBy(genre).agg( count(*).alias(movie_count), round(avg(rating), 2).alias(avg_rating), round(avg(box_office), 2).alias(avg_box_office) ).orderBy(desc(avg_box_office)) result.show(20)这段代码先把 Hive 中的电影信息和票房信息分别读入 DataFrame再通过join操作将数据关联起来。关联条件中同时匹配电影名和年份能减少同名电影带来的误关联。如果实际场景中两个表的数据量分别为几万条和几十万条直接按字符串等值关联在分布式环境下也没有问题。但要注意如果数据量进一步增大比如上亿条就需要考虑字段统一清洗和分桶优化。毕业设计阶段先把流程跑通是优先目标。6.3 分析结果写入 MySQLresult.show()可以让我们在控制台看到结果但可视化模块需要使用接口查询数据。为了方便后续 Flask 读取建议把统计结果写入 MySQL。result.write.format(jdbc) \ .option(url, jdbc:mysql://localhost:3306/movie_db) \ .option(driver, com.mysql.cj.jdbc.Driver) \ .option(dbtable, movie_genre_stats) \ .option(user, root) \ .option(password, your_password) \ .mode(overwrite) \ .save()需要注意Spark 通过 JDBC 写 MySQL 时需要把 MySQL 的 JDBC 驱动 jar 放到 Spark 的jars目录下。不同 Spark 版本对 JDBC 驱动的类名要求不同MySQL 8.x 使用com.mysql.cj.jdbc.DriverMySQL 5.x 使用com.mysql.jdbc.Driver。mode(overwrite)会先删除目标表再重建适合重复测试生产环境通常使用append或自定义写入逻辑。6.4 可扩展的分析指标除了按类型统计还可以扩展以下分析方向历年电影产量与平均评分趋势。导演作品数量与作品平均分排名。高票房电影榜单 Top 10。地区分布与电影数量关系。评分与票房的相关性分析。这些指标都基于同一套数据流程只是改变groupBy和agg的逻辑。你可以结合自己的项目需求选择 3 到 4 个核心指标不需要全部实现。7. 可视化展示模块7.1 Flask 后端接口可视化模块采用前后端分离的简单方式Flask 提供数据接口前端页面通过 AJAX 或fetch请求接口并渲染图表。接口的数据来源是 MySQL 中保存的分析结果。# 文件路径src/web/app.py from flask import Flask, jsonify, render_template import pymysql app Flask(__name__) DB_CONFIG { host: localhost, user: root, password: your_password, database: movie_db, charset: utf8mb4 } def query(sql): conn pymysql.connect(**DB_CONFIG) try: with conn.cursor(pymysql.cursors.DictCursor) as cursor: cursor.execute(sql) return cursor.fetchall() finally: conn.close() app.route(/) def index(): return render_template(index.html) app.route(/api/genre_stats) def genre_stats(): sql SELECT genre, movie_count, avg_rating, avg_box_office FROM movie_genre_stats ORDER BY movie_count DESC return jsonify(query(sql)) if __name__ __main__: app.run(host0.0.0.0, port5000)这里的query函数使用pymysql.cursors.DictCursor查询结果会以字典列表形式返回直接就能转成 JSON。需要注意password目前是明文写在代码里课程设计可以接受但真实项目中应该使用环境变量或配置文件管理敏感信息。7.2 ECharts 前端图表ECharts 是目前常用的前端可视化库。通过 CDN 引入之后只需准备一个具备宽高的 DOM 节点然后调用setOption就能生成图表。下面是一个按类型展示平均票房的柱状图示例。!-- 文件路径src/web/templates/index.html -- !DOCTYPE html html langzh-CN head meta charsetUTF-8 title电影票房数据分析可视化/title script srchttps://cdn.jsdelivr.net/npm/echarts5/dist/echarts.min.js/script style #chart { width: 900px; height: 500px; margin: 40px auto; } /style /head body div idchart/div script fetch(/api/genre_stats) .then(res res.json()) .then(data { const chart echarts.init(document.getElementById(chart)); chart.setOption({ title: { text: 各类型电影平均票房对比 }, tooltip: {}, xAxis: { data: data.map(item item.genre) }, yAxis: {}, series: [{ type: bar, data: data.map(item item.avg_box_office) }] }); }); /script /body /html这个示例只展示了柱状图。实际项目中你还可以继续添加饼图、折线图、散点图。比如用饼图展示地区分布占比用折线图展示历年平均评分趋势。每张图对应一个接口前端逻辑保持一致。7.3 常见可视化图表与数据指标对照图表类型表达的数据关系对应指标柱状图分类对比各类型电影数量、平均票房折线图时间趋势历年电影产量、历年平均评分饼图占比构成地区分布、类型占比散点图两个变量关系评分与票房相关性一开始可以先做一个能用的柱状图把整条链路跑通再逐步补充其他图表。这样即使时间紧张也能保证系统具有完整演示效果。8. 常见问题排查项目开发过程中最容易出问题的阶段往往是大数据组件集成和数据格式匹配。下面整理了高频问题以及排查思路。问题现象常见原因解决思路爬虫请求返回 403 或 418请求头不完整IP 被目标站点限制增加 User-Agent、Cookie降低请求频率避免并发抓取Hive 建表后 SELECT 没有数据HDFS 路径不对或 CSV 字段与表结构不匹配检查 LOCATION 是否指向文件所在目录确认分隔符和字段个数Spark SQL 读不到 Hive 表未启用 Hive 支持或缺少 hive-site.xml 配置配置enableHiveSupport()并将 hive-site.xml 放入 Spark 的 conf 目录Hive 中中文显示乱码文件编码或 Hive 客户端连接字符集问题CSV 使用 UTF-8 编码Hive 连接或 beeline 设置 utf8 字符集MySQL 写入中文乱码表字符集不是 utf8mb4或 JDBC URL 缺少编码参数建库建表使用 utf8mb4JDBC URL 增加characterEncodingutf8Spark 写 MySQL 报 ClassNotFoundException缺少 MySQL JDBC 驱动 jar下载对应版本的 mysql-connector-j 放入 Spark jars 目录Flask 启动时 5000 端口被占用macOS AirPlay 或其他服务占用 5000 端口修改app.run(port5001)或在系统设置中关闭相关端口占用Spark 任务频繁 OOM执行器内存不足或数据倾斜增加 executor 内存检查 groupBy 字段是否存在严重数据倾斜HDFS 启动后 DataNode 未连接集群时间不同步或端口配置被修改检查节点时间、防火墙状态并查看日志定位连接失败原因排查问题的核心思路是分层检查先确认数据文件存在且格式正确再确认表结构映射最后检查计算任务和连接配置。尽量不要直接在大数据组件启动时就怀疑环境损坏很多问题都出在路径和配置上。9. 论文与答辩准备9.1 论文结构建议论文结构可以按软件工程的经典顺序组织但在技术实现部分要突出大数据处理链路。参考目录如下绪论项目背景、国内外研究现状、研究意义。相关技术介绍Python 爬虫、Hadoop、Hive、Spark、ECharts。需求分析功能需求、非功能需求。系统总体设计架构设计、数据流程、模块划分。系统详细设计与实现按数据采集、数据存储、数据分析、可视化拆分。系统测试功能测试、性能测试、数据分析结果验证。总结与展望项目成果、不足、后续改进方向。其中第 5 章是最重要的内容需要把关键配置和代码截图放入论文同时说明“为什么这么实现”。例如Hive 建表为什么使用外部表Spark 为什么选择 DataFrame API都是常见的评分点。9.2 答辩高频问题准备答辩时老师不会只关心你写了多少代码更关心你是否理解技术选型背后的逻辑。常见问题包括为什么用 Spark 而不用 Hadoop MapReduce回答思路MapReduce 中间结果落盘多迭代和交互式分析效率低开发模型不够友好。Spark 基于内存计算DataFrame API 更接近 SQL开发效率高适合本项目中的多次聚合和关联计算。Hive 外部表和内部表的区别回答思路内部表数据由 Hive 管理删除表时数据文件也会删除外部表只管理元数据删除表不会删除 HDFS 中数据。项目中使用外部表是为了保护原始数据。如果数据量扩大 100 倍系统怎么优化回答思路存储层增加节点数据分区与分桶Spark 增加 Executor 数量对
返回列表