手把手搭建电商用户行为分析系统
一、项目背景:当大数据课遇上期末作业
这学期《大数据分析与应用》的期末大作业,我选择了电商用户行为分析。选这个方向有三个原因:
-
场景熟悉:大家都网购过,容易理解业务逻辑
-
数据好找:有公开数据集(天池、Kaggle)
-
技术栈全面:能用到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,包含:
-
热销商品排行榜(柱状图)
-
用户行为分布(饼图)
-
日活跃用户趋势(折线图)
-
转化漏斗图
五、我遇到的坑和解决办法
坑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)
六、这个项目带给我的收获
-
技术串联:真正理解了数据从原始日志->HDFS->Spark处理->MySQL->可视化展示的全流程
-
解决问题的能力:查文档、搜CSDN、看Stack Overflow,解决问题的能力直线上升
-
简历资本:这个项目成了我面试时最拿得出手的作品
-
学习信心:专科生也能做出完整的大数据项目,技术不在于学历而在于动手
七、给你的建议
如果你想做类似的项目:
-
先从简单的来:不要追求百万级数据,先用几千条数据跑通流程
-
模块化开发:先写数据读取模块,再写分析模块,最后写可视化
-
善用Git:每完成一个功能就commit一次,方便回退
-
多写注释:过一周你自己都可能看不懂自己写的代码
更多推荐



所有评论(0)