共计 1818 个字符,预计需要花费 5 分钟才能阅读完成。
背景与痛点分析
Amazon Beauty 数据集包含用户对美容产品的评分、评论和元数据,是构建推荐系统的典型场景。但在实际处理时,我们面临几个核心挑战:

- 数据稀疏性 :用户 - 商品交互矩阵极度稀疏(<1% 填充率),传统协同过滤效果差
- 长尾分布 :80% 的交互集中在 20% 的热门商品,冷门商品难以获得有效推荐
- 规模瓶颈 :原始数据包含数百万条记录,Pandas 单机处理经常内存溢出
传统方法如基于 Pandas 的矩阵分解面临两大瓶颈:
- 数据加载时频繁的 GC 操作导致处理速度指数级下降
- 特征交叉计算时缺乏分布式能力,无法利用集群资源
技术选型:为什么选择 PySpark
通过对比测试 100 万条记录的处理性能:
| 操作类型 | Pandas(单机) | PySpark(4 节点) |
|---|---|---|
| 数据加载 | 12.3s | 4.8s |
| 缺失值填充 | 8.7s | 3.2s |
| TF-IDF 计算 | 内存溢出 | 28.5s |
PySpark 的核心优势在于:
- 内存管理 :通过 RDD 的弹性分布式数据集特性自动处理内存溢出
- 并行计算 :将 TF-IDF 等耗时操作分发到集群节点并行执行
- 生态集成 :MLlib 与 TensorFlow 无缝衔接,支持端到端流水线
核心实现步骤
数据清洗实战
from pyspark.sql import functions as F
# 关键清洗逻辑
def clean_data(raw_df):
# 处理评分异常值(1- 5 分范围)df = raw_df.filter((F.col("rating") >= 1) &
(F.col("rating") <= 5)
)
# 填充缺失的 reviewText
df = df.fillna({"reviewText": ""})
# 标准化时间格式
return df.withColumn(
"unixReviewTime",
F.unix_timestamp("reviewTime", "yyyy-MM-dd HH:mm:ss")
)
特征工程优化
采用两级特征提取策略:
- 文本特征 :先用 TF-IDF 提取关键词权重
- 语义特征 :再用 Word2Vec 捕获上下文关系
from pyspark.ml.feature import HashingTF, IDF, Word2Vec
# 优化技巧:调整 hash 分桶数减少冲突
tf = HashingTF(
inputCol="tokenized",
outputCol="raw_features",
numFeatures=2000 # 根据集群内存调整
)
# 分布式 IDF 计算
idf = IDF(minDocFreq=5, inputCol="raw_features", outputCol="tfidf")
# Word2Vec 参数调优
w2v = Word2Vec(
vectorSize=128,
minCount=3, # 过滤低频词
windowSize=5,
inputCol="tokenized",
outputCol="w2v_features"
)
架构设计
flowchart LR
A[原始数据] --> B[Spark SQL 清洗]
B --> C[特征工程]
C --> D{Train/Test Split}
D --> E[ALS 矩阵分解]
D --> F[Neural CF]
E --> G[模型融合]
F --> G
G --> H[API 服务]
避坑指南
避免 OOM 的配置技巧
- partition 调优 :保证每个 partition 数据量在 128MB 左右
spark.conf.set("spark.sql.shuffle.partitions", 200) # 根据 executor 数量调整 - 缓存策略 :对复用多次的 DataFrame 进行持久化
df.persist(StorageLevel.MEMORY_AND_DISK)
处理类别不平衡
- 负采样 :对热门商品交互进行下采样
- 加权损失 :在模型训练时增加冷门商品的权重
性能优化成果
| 数据量 | 4 节点 (8core/32G) | 8 节点 (16core/64G) |
|---|---|---|
| 100 万条 | 42 分钟 | 18 分钟 |
| 500 万条 | 3.2 小时 | 1.5 小时 |
资源配置建议 :
– Executor 内存至少 16GB
– 每个 Executor 配置 5 - 7 个 core 避免上下文切换开销
延伸思考
- 如何利用用户浏览但未购买的行为数据(隐式反馈)提升推荐效果?
- 当新商品上线时,除了基于内容的推荐,还有哪些冷启动解决方案?
- 在多模态场景下,如何有效融合商品图片特征与文本特征?
在实际项目中,我们通过这套方案将 CTR(点击通过率) 提升了 37%。关键收获是:分布式计算不是银弹,需要根据数据特性组合多种特征提取方法。建议读者先从 100 万数据子集开始验证流程,再逐步扩展到全量数据。
正文完
