软件工程+大数据毕设:新手如何从零构建一个可维护的毕业设计项目

📅 发布时间:2026/7/9 7:09:47 👁️ 浏览次数:
软件工程+大数据毕设:新手如何从零构建一个可维护的毕业设计项目
软件工程大数据毕设新手如何从零构建一个可维护的毕业设计项目一、先吐槽那些年我们一起踩过的毕设坑如果你打开 GitHub 搜““graduation-project”大概率会看到一堆“一次性代码”一个 2000 行的main.py从爬虫到机器学习全塞里面数据文件用绝对路径D:/张三/desktop/data.json换电脑就跑不通没有 requirements.txt队友跑起来全靠“玄学”训练好的模型 800 M直接 push 到仓库Git LFS 额度瞬间爆炸这些“骚操作”背后其实是同一个根因把毕设当成实验报告而不是软件项目。软件工程教过我们“需求→设计→编码→测试→交付”五部曲大数据课又告诉我们要“采集→清洗→分析→可视化”。可一旦真刀真枪写毕设很多人就把流程图一扔先写代码再说。结果答辩现场“同学如果数据量再翻十倍你的脚本还能跑吗”“额……老师我笔记本内存 16G应该……能行”别笑我当年也这样。所以这篇笔记就想用“软件工程大数据”的双拼思路带你从 0 搭一个能跑、能改、能展示的毕设项目。读完你可以直接 fork 模板改数据也能把工程实践写进简历。二、技术选型不选最贵只选最“毕设友好”大数据框架多到眼花我们先给本科场景画个像数据规模百万级日志、GB 级文本撑死几十 GB机器一台 8 核 16G 的 Ubuntu 服务器或者实验室老台式机人手12 个开发编码经验 3 年时间3 个月还要抽 1 个月写论文基于以上直接上结论框架选/弃理由Hadoop弃重MapReduce 写 Java 累小数据用牛刀Flink观望实时牛但流批一体概念多学习曲线陡Spark选PySpark API 友好单机伪分布式就能跑社区案例一搜一大把Flask选轻量毕设级 REST 接口够用插件成熟FastAPI可选异步性能高自动生成 Swagger但部署需 uvicorn对新手多一步配置结论PySpark Flask PostgreSQL是“能跑、能写、能讲”的最小闭环。如果团队里有大神再考虑 Flink 或 FastAPI 不迟。三、核心实现用“用户行为日志分析”跑通全流程1. 需求一句话版本“采集 Web 埋点日志统计用户 PV、UV、留存可视化展示并支持下载 CSV 报表。”2. 分层架构图先画一张“看起来就很工程”的架构图再开始撸码3. 模块拆解采集层Nginx → 埋点 JS → 本地文件清洗层PySpark 读日志解析 JSON过滤爬虫流量写 Parquet存储层Parquet 放对象存储或本地 SSD维度表同步到 PostgreSQL服务层Flask 提供/api/v1/stats接口返回 PV、UV、留存 JSON可视化层Vue ECharts调接口画图前端不是重点可拿模板改4. 数据模型事实表fact_loguser_id, session_id, event_time, page_url, ip维度表dim_pagepage_id, page_url, module, title维度表dim_useruser_id, first_visit, last_visit, city这样把“大宽表”拆成“星型模型”后面加字段不用改全表论文里也能吹一波“维度建模”。四、代码示例能跑、能读、能改1. PySpark 清洗脚本 —— clean_logs.py# -*- coding: utf-8 -*- 清洗原始埋点日志输出 Parquet import os from pyspark.sql import SparkSession from pyspark.sql.functions import col, from_json, to_date from pyspark.sql.types import StructType, StructField, StringType, LongType spark SparkSession.builder \ .appName(CleanAccessLog) \ .master(local[*]) \ .config(spark.sql.execution.arrow.pyspark.enabled, true) \ .getOrCreate() # 1. 定义日志 schema schema StructType([ StructField(user_id, StringType(), True), StructField(session_id, StringType(), True), StructField(event, StructType([ StructField(page_url, StringType(), True), StructField(event_time, LongType(), True) ]), True) ]) # 2. 读原始 json 日志 raw_df spark.read.json(data/raw/*.log) # 3. 解析并扁平化 clean_df raw_df.select( col(user_id), col(session_id), col(event.page_url).alias(page_url), (col(event.event_time) / 1000).cast(timestamp).alias(event_time) ) # 4. 过滤爬虫 空值 bot_list {bot, spider, crawler} clean_df clean_df.filter( ~col(user_id).rlike(|.join(bot_list)) col(page_url).isNotNull() ) # 5. 写 Parquet按日期分区 clean_df.withColumn(dt, to_date(event_time)) \ .write \ .partitionBy(dt) \ .mode(overwrite) \ .parquet(data/parquet/) spark.stop()关键点用partitionBy(dt)让后面按日期查询飞快论文可写“减少全表扫描”过滤逻辑单独放方便单元测试assert 爬虫 user_agent 被 drop 掉2. Flask API —— app.pyimport os from flask import Flask, request, jsonify import psycopg2 from datetime import datetime, timedelta app Flask(__name__) # 从环境变量读配置不写死 DB_DSN os.getenv(DB_DSN, postgresql://user:passlocalhost:5432/graduation) def get_conn(): return psycopg2.connect(DB_DSN) app.route(/api/v1/stats, methods[GET]) def stats(): 查询最近 N 日 PV/UV days int(request.args.get(days, 7)) if days 0 or days 365: return jsonify({msg: days invalid}), 400 sql SELECT dt, COUNT(*) AS pv, COUNT(DISTINCT user_id) AS uv FROM fact_log WHERE dt BETWEEN %s AND %s GROUP BY dt ORDER BY dt; end_dt datetime.utcnow().date() start_dt end_dt - timedelta(daysdays-1) with get_conn() as conn, conn.cursor() as cur: cur.execute(sql, (start_dt, end_dt)) rows cur.fetchall() return jsonify({data: [{date: str(r[0]), pv: r[1], uv: r[2]} for r in rows]}) if __name__ __main__: # 开发环境开 debug生产环境用 gunicorn app.run(debugTrue)Clean Code 小套路函数 30 行一眼看完SQL 不拼接字符串防注入配置全读环境变量Docker 一行docker run -e DB_DSNxxx就能起五、性能与安全小数据也要“ professionalism ”资源开销Spark 本地模式默认吃满所有核可通过local[4]限制给笔记本留点活路Flask 单进程 100 并发够用压测ab -c 50 -n 1000QPS 300毕设评委已惊呆API 幂等性统计类接口天然幂等但下载报表接口如果带“随机采样”就要小心给文件名加hash(seed参数)同参同文件避免重复点按钮生成多份 CSV。敏感字段脱敏日志里别存手机号、订单号原文只存哈希返回前端前统一走脱敏函数def mask_id(user_id: str) - str: return user_id[:4] **** user_id[-4:]六、生产环境避坑让代码不止“能跑”Git 分支策略master随时可打 tag 给导师演示dev日常开发PR 合并跑 CIGitHub Actions 免费 2000 分钟/月paper 写论文阶段只改文档不动代码避免“代码回滚论文也回滚”配置与密钥用.envpython-dotenv本地加载生产环境走正式环境变量绝不把SECRET_KEY、DB密码提交到仓库就算私有库也可能手滑开源硬编码大坑路径用pathlib.Path(__file__).with_name(data)相对定位模型版本号、临时目录都放config.yaml改一稿论文只需改配置不动源码开发-部署一致性写Dockerfile时把 Spark、Python、系统依赖一次打包避免“我本地能跑”用docker-compose一键起 PostgreSQL Flask导师笔记本装 Docker 就能复现七、把毕设升级成“能展示的作品”代码跑完、论文写完别忘了做三件事录一段 2 分钟 Demo 视频放 B 站/网盘二维码二维码贴 PPT 最后一页把架构图、接口文档、性能压测报告整理成 5 页 PDF面试直接甩给 HR开源仓库写好 README把安装步骤浓缩成三条命令让下一届学弟 star 你的项目当你能对着面试官说出“我用 Spark 做 ETL、Flask 写 REST、Docker 做持续集成”毕设就不再是课程作业而是你的第一个“工程作品”。最后别急着关网页。打开你现在的毕设文件夹挑一个脚本按本文的目录结构重构一遍——把大文件拆成小模块把魔法数改成配置项把“能跑”升级为“能维护”。哪怕只花一个周末你也会发现原来软件工程课里那些“啰嗦”的流程真的能让代码呼吸。动手吧祝你答辩时不再被问“如果数据量翻十倍怎么办”而是听到老师说“这位同学的项目可以留给下一届当模板。”