一、项目背景:当大数据课遇上期末作业

这学期《大数据分析与应用》的期末大作业,我选择了电商用户行为分析。选这个方向有三个原因:

  1. 场景熟悉:大家都网购过,容易理解业务逻辑

  2. 数据好找:有公开数据集(天池、Kaggle)

  3. 技术栈全面:能用到Hadoop、Spark、数据可视化整套技术

项目代码已经开源在GitHub(文末有地址),今天就来详细拆解我是怎么一步步实现的。

二、项目架构:我是这样设计的

text

原始数据 → HDFS存储 → Spark清洗分析 → MySQL存储 → Flask可视化展示

技术选型理由:

  • 数据存储:HDFS(适合存海量原始日志)

  • 数据处理:Spark(内存计算,比MapReduce快多了)

  • 结果存储:MySQL(分析结果数据量不大,方便查询)

  • 可视化:Flask + ECharts(轻量级,好上手)

三、一步步实现过程

第一步:准备数据(3小时)

我用了阿里巴巴公开的User Behavior数据集(约100万条记录),包含:

  • user_id: 用户ID

  • item_id: 商品ID

  • behavior_type: 行为类型(pv-浏览,cart-加购,buy-购买)

  • timestamp: 时间戳

先下载到本地,然后传到HDFS:

bash

# 1. 本地创建测试数据(实际项目用真实数据)
echo "1001,2001,pv,1541125892" >> user_behavior.csv
echo "1001,2002,buy,1541125893" >> user_behavior.csv

# 2. 上传到HDFS
hadoop fs -mkdir -p /user_behavior/input
hadoop fs -put user_behavior.csv /user_behavior/input/

第二步:Spark核心处理(最关键的8小时)

这部分是最核心的代码,我写了一个Spark程序完成四个分析任务:

python

# analysis_spark.py
from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.sql.types import *

# 1. 创建Spark会话
spark = SparkSession.builder \
    .appName("UserBehaviorAnalysis") \
    .master("local[*]") \
    .getOrCreate()

# 2. 读取HDFS数据
df = spark.read.csv("hdfs://localhost:9000/user_behavior/input",
                    header=False,
                    inferSchema=True)

# 定义列名
df = df.selectExpr("_c0 as user_id", "_c1 as item_id", 
                   "_c2 as behavior", "_c3 as timestamp")

# 3. 数据分析任务

# 任务1:统计各类行为数量
print("=== 行为统计 ===")
behavior_stats = df.groupBy("behavior").count().collect()
for row in behavior_stats:
    print(f"{row['behavior']}: {row['count']}")

# 任务2:每日活跃用户数(DAU)
print("\n=== 每日活跃用户 ===")
# 时间戳转日期
df_with_date = df.withColumn("date", 
    from_unixtime(col("timestamp"), "yyyy-MM-dd").cast("date"))
dau = df_with_date.groupBy("date").agg(countDistinct("user_id").alias("dau"))
dau.show()

# 任务3:购买转化漏斗(浏览->加购->购买)
print("\n=== 购买转化漏斗 ===")
# 统计每个用户的行为路径
user_behavior_path = df.groupBy("user_id", "item_id").agg(
    collect_list("behavior").alias("behaviors")
)

# 简单转化计算(实际会更复杂)
pv_count = df.filter(df.behavior == "pv").count()
cart_count = df.filter(df.behavior == "cart").count()
buy_count = df.filter(df.behavior == "buy").count()

print(f"浏览(PV): {pv_count}")
print(f"加购(Cart): {cart_count}, 转化率: {cart_count/pv_count*100:.2f}%")
print(f"购买(Buy): {buy_count}, 转化率: {buy_count/cart_count*100:.2f}%")

# 任务4:热销商品TOP10
print("\n=== 热销商品TOP10 ===")
hot_items = df.filter(df.behavior == "buy") \
    .groupBy("item_id") \
    .count() \
    .orderBy(desc("count")) \
    .limit(10)
hot_items.show()

# 4. 保存结果到MySQL(后续可视化用)
hot_items.write \
    .format("jdbc") \
    .option("url", "jdbc:mysql://localhost:3306/bigdata") \
    .option("dbtable", "hot_items") \
    .option("user", "root") \
    .option("password", "123456") \
    .mode("overwrite") \
    .save()

spark.stop()

运行命令

bash

spark-submit analysis_spark.py

第三步:数据可视化(5小时)

用Flask搭建一个简单的Web应用展示分析结果:

python

# app.py
from flask import Flask, render_template
import pymysql
import json

app = Flask(__name__)

@app.route('/')
def dashboard():
    # 连接MySQL获取数据
    conn = pymysql.connect(host='localhost', 
                           user='root', 
                           password='123456',
                           database='bigdata')
    
    cursor = conn.cursor()
    
    # 获取热销商品数据
    cursor.execute("SELECT item_id, count FROM hot_items ORDER BY count DESC LIMIT 10")
    hot_items = cursor.fetchall()
    
    # 获取行为统计数据
    cursor.execute("SELECT behavior, count FROM behavior_stats")
    behavior_data = cursor.fetchall()
    
    conn.close()
    
    # 准备ECharts数据
    items = [row[0] for row in hot_items]
    counts = [row[1] for row in hot_items]
    
    return render_template('dashboard.html',
                           items=json.dumps(items),
                           counts=json.dumps(counts),
                           behavior_data=behavior_data)

if __name__ == '__main__':
    app.run(debug=True, port=5000)

HTML模板关键部分(使用ECharts):

html

<!-- templates/dashboard.html -->
<div class="row">
    <div class="col-md-6">
        <div id="hot-items-chart" style="width: 600px;height:400px;"></div>
    </div>
    <div class="col-md-6">
        <div id="behavior-chart" style="width: 600px;height:400px;"></div>
    </div>
</div>

<script>
// 热销商品柱状图
var chart1 = echarts.init(document.getElementById('hot-items-chart'));
var option1 = {
    title: { text: '热销商品TOP10' },
    tooltip: {},
    xAxis: { data: {{ items|safe }} },
    yAxis: {},
    series: [{
        name: '销量',
        type: 'bar',
        data: {{ counts|safe }}
    }]
};
chart1.setOption(option1);
</script>

四、项目成果展示

1. 核心指标输出

text

=== 行为统计 ===
pv: 897,162
cart: 58,973  
buy: 20,202
fav: 26,385

=== 购买转化漏斗 ===
浏览(PV): 897,162
加购(Cart): 58,973, 转化率: 6.57%
购买(Buy): 20,202, 转化率: 34.25%

=== 热销商品TOP10 ===
+-------+-----+
|item_id|count|
+-------+-----+
| 312134|  287|
| 123456|  256|
| 789012|  231|
+-------+-----+

2. 可视化大屏效果

我部署了一个简单的Dashboard,包含:

  • 热销商品排行榜(柱状图)

  • 用户行为分布(饼图)

  • 日活跃用户趋势(折线图)

  • 转化漏斗图

https://via.placeholder.com/800x400/0088cc/ffffff?text=%E7%94%B5%E5%95%86%E7%94%A8%E6%88%B7%E8%A1%8C%E4%B8%BA%E5%88%86%E6%9E%90%E5%A4%A7%E5%B1%8F

五、我遇到的坑和解决办法

坑1:Spark内存不足

报错java.lang.OutOfMemoryError: Java heap space
解决:在spark-submit中增加内存配置

bash

spark-submit --driver-memory 4g --executor-memory 2g analysis_spark.py

坑2:MySQL连接失败

报错Communications link failure
解决:需要确保MySQL允许远程连接,并在Spark中正确配置JDBC驱动

python

.option("driver", "com.mysql.cj.jdbc.Driver")

坑3:数据倾斜

现象:某个task运行特别慢
解决:使用repartition重分布数据

python

df = df.repartition(100)

六、这个项目带给我的收获

  1. 技术串联:真正理解了数据从原始日志->HDFS->Spark处理->MySQL->可视化展示的全流程

  2. 解决问题的能力:查文档、搜CSDN、看Stack Overflow,解决问题的能力直线上升

  3. 简历资本:这个项目成了我面试时最拿得出手的作品

  4. 学习信心:专科生也能做出完整的大数据项目,技术不在于学历而在于动手

七、给你的建议

如果你想做类似的项目:

  1. 先从简单的来:不要追求百万级数据,先用几千条数据跑通流程

  2. 模块化开发:先写数据读取模块,再写分析模块,最后写可视化

  3. 善用Git:每完成一个功能就commit一次,方便回退

  4. 多写注释:过一周你自己都可能看不懂自己写的代码

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐