实验3:PySpark数据分析(4学时)
在Windows打开学生包starter/reports/lab03-report.docx,另存为学号+班级+姓名+实验3报告.docx。每步按下方列出的Word栏目填写结果、粘贴文本和插入图片,最终提交这一份Word报告。
目标与起点
从L03镜像开始,Spark、Hadoop和对应Python环境已就绪。用独立销售样例完成RDD、DataFrame和SQL练习;练习过滤、分组和求和。
建议180分钟:RDD25;清洗45;汇总与SQL40;YARN25;参数与故障25;整理报告20。
labctl stop
labctl start lab03
cd ~/work/lab03
mkdir -p evidence
spark-submit rdd_demo.py
准备阶段先运行labctl doctor并记录镜像编号;截图、结果与源码按记录与提交方法整理。
1 RDD观察
预期平方为 [1,4,9,16],分区数为2。补充“过滤偶数并求和”,先预测结果6。把输入分区改为1和2,比较结果;记录分区数与计算结果;本次比较关注分区语义。
本步填写 Word 报告:1 RDD观察
粘贴和填写
- 两次运行输出:粘贴分区1与分区2的命令、分区数、平方列表及偶数和。
- 预测与解释:填写修改前预测,说明分区数变化与本次结果的关系。
预期结果核对
| 核对项目 | 预期结果 |
|---|---|
| 分区数 | 分别运行1和2 |
| 平方列表 | 两次均为[1,4,9,16] |
| 偶数之和 | 两次均为6 |
2 明确清洗口径
输入 /opt/course/data/sales.csv 共8条订单:
- 只保留
quantity > 0且unit_price非空、非负的行,留下5条。 - 每行营业额为
quantity * unit_price,按category汇总。 - 此样例价格均为整数,使用样例单位;实训金额统一用整数“分”,避免浮点货币误差。
手算:books为40、food为31、tools为30,总营业额101。完成 analyze.py 的三个TODO,输出本地 report.json,形状为 {"books":40,"food":31,"tools":30}。JSON键顺序不影响检查。
spark-submit analyze.py
cat report.json
labctl check lab03
本步填写 Word 报告:2 明确清洗口径
粘贴和填写
- 数据与手算:粘贴sales.csv原文;按订单写被过滤原因及三类营业额的手算过程。
- 程序结果:粘贴清洗前后行数输出、运行命令及本地report.json全文。
- 实现说明:说明过滤条件、营业额列与聚合方法,源码放到源码区。
预期结果核对
| 核对项目 | 预期结果 |
|---|---|
| 输入与清洗行数 | 8条→5条 |
| 过滤订单 | 6 数量0;7 数量负;8 单价NULL |
| 类别营业额 | books=40 food=31 tools=30 |
| 总营业额 | 101 |
3 SQL对照
将清洗后的DataFrame注册为临时视图,使用SQL完成同一统计。把SQL和运行结果放进报告;两种写法使用相同清洗口径,结果应一致。本次将NULL单价作为无效记录过滤。
本步填写 Word 报告:3 SQL对照
粘贴和填写
- SQL与视图:粘贴注册临时视图的代码和执行SQL的完整查询。
- 对照结果:粘贴DataFrame与SQL两份实际输出,逐类写是否一致。
预期结果核对
| 核对项目 | 预期结果 |
|---|---|
| 视图口径 | 使用清洗后的DataFrame |
| SQL与DataFrame结果 | 均为books40 food31 tools30 |
4 从HDFS读取并提交YARN
hdfs dfs -mkdir -p /course/lab03
hdfs dfs -put -f /opt/course/data/sales.csv /course/lab03/sales.csv
spark-submit --master yarn --deploy-mode client analyze.py \
--input hdfs://localhost:9000/course/lab03/sales.csv
labctl check lab03
本实验使用client模式,driver在当前虚拟机进程中,便于把小型report.json保存到当前目录。运行结束后YARN页面记录application ID;网页记录与结果检查需同时提供。
本步填写 Word 报告:4 从HDFS读取并提交YARN
粘贴和填写
- 上传与运行:粘贴上传CSV、spark-submit --master yarn --deploy-mode client的完整命令及application ID。
- 结果与路径:粘贴本地和YARN两份JSON,填写Driver结果的绝对路径与状态日志。
预期结果核对
| 核对项目 | 预期结果 |
|---|---|
| 输入URI | hdfs://localhost:9000/course/lab03/sales.csv |
| 最终状态 | FINISHED和SUCCEEDED |
| 输出 | Driver本地report.json 与本地结果相同 |
插图位置
- 图1 Spark的YARN应用(模板标识
04-yarn.png):包含地址栏、同一个application ID、FINISHED与SUCCEEDED,能够读清关键状态。
5 新订单与路径修复
另存一份CSV,加入一条 9,books,2,15 的有效订单(四列依次为订单编号、类别、数量、单价),预测books变为70再验证。保留原始数据,用 --input 指向新文件。
故障练习:将输入路径写错一次;从错误消息中提取缺失路径,再用 ls 或 hdfs dfs -ls 检查对应文件系统。按实际文件位置修正输入参数。
新输入保持CSV表头与四列结构,追加完整订单9,books,2,15。保存为evidence/05-sales-personal.csv,执行:
spark-submit analyze.py --input evidence/05-sales-personal.csv \
--output evidence/05-personal-report.json 2>&1 | tee evidence/05-personal.log
本步填写 Word 报告:5 新订单与路径修复
粘贴和填写
- 个人输入与结果:粘贴新增行、--input与--output命令、个人JSON全文及预测值。
- 路径错误与修复:粘贴错误路径命令、错误原文、ls或HDFS列表、修正命令与运行结果。
- 最终检查:粘贴labctl check lab03输出。
预期结果核对
| 核对项目 | 预期结果 |
|---|---|
| 新增CSV行 | 9,books,2,15 |
| 个人结果 | books=70 food=31 tools=30 总额131 |
| 规定report.json | 保留原始结果 总额101 |
报告提交前核对
对应 Word 的“源码与运行说明”区
- rdd_demo.py全文。
- analyze.py全文。
- query.sql全文。
按模板粘贴实际运行内容,保留缩进并填写文件在虚拟机中的绝对路径。
逐项检查
- [ ] 报告“1 RDD观察”的实际结果及填写栏目完整。
- [ ] 报告“2 明确清洗口径”的实际结果及填写栏目完整。
- [ ] 报告“3 SQL对照”的实际结果及填写栏目完整。
- [ ] 报告“4 从HDFS读取并提交YARN”的实际结果及填写栏目完整。
- [ ] 报告“5 新订单与路径修复”的实际结果及填写栏目完整。
- [ ] 图1 Spark的YARN应用已插入,符合模板中的截图要求。
- [ ] 姓名、学号、班级等身份信息完整;实训填写全体成员及个人记录。
- [ ] AI使用情况报告填写简短说明或粘贴一张相关截图;未使用填“未使用”。
- [ ] 保存后重新用Microsoft Word打开,检查截图和文本可读。
按Word记录与提交方法提交填写完成的一份Word报告。教师依据报告中的实际结果、源码、截图和个人记录评分。