Spark离线数据处理知识点总结

一、环境搭建与工具准备

1.1 必备工具包

# 基础数据处理
pip install pandas==1.2.4  # 数据清洗利器
# 大数据处理
pip install pyspark==3.0.3  # 分布式计算框架
# 数据可视化
pip install pyecharts==1.9.0  # 交互式图表

1.2 版本管理要点

  • 注意Pandas与PySpark的版本兼容性

  • Pyecharts 1.x与2.x的API差异较大

二、数据清洗核心技巧

2.1 重复数据处理

# 检测重复值
df[df.duplicated()]
# 删除重复值(保留第一条)
df.drop_duplicates(inplace=True)
# 重建索引
df.reset_index(drop=True, inplace=True)

2.2 缺失值处理策略

方法代码示例适用场景
前向填充df.fillna(method='ffill')时间序列数据
后向填充df.fillna(method='bfill')末尾数据缺失
均值填充df.fillna(df.mean())数值型特征
删除记录df.dropna()缺失比例小时

2.3 数据格式标准化

# 日期格式统一化(处理混合格式)
df['日期'] = df['日期'].apply(
    lambda x: pd.to_datetime(x, format='%Y#%m#%d') 
    if '#' in str(x) else pd.to_datetime(x))

# 带单位数值清洗
df['数量'] = df['数量'].str.extract('(\d+)').astype(int)
df['价格'] = df['价格'].str.replace('元','').astype(float)

三、Spark SQL核心操作

3.1 窗口函数应用

from pyspark.sql import Window
import pyspark.sql.functions as F

# 定义窗口规范
window_spec = Window.partitionBy("商品小类").orderBy(F.desc("销售单价"))

# 计算每个商品小类价格排名
df.withColumn("价格排名", F.rank().over(window_spec)) \
  .filter(F.col("价格排名") <= 5)  # 获取各类TOP5

3.2 常见聚合操作

# 按月统计销售额
(df.groupBy(F.date_format("订单日期", "yyyy-MM").alias("月份"))
   .agg(F.sum("金额").alias("月销售额"))
   .orderBy("月份"))

四、数据分析方法论

4.1 RFM模型实现

# 计算R(最近购买)、F(购买频次)、M(消费金额)
rfm = (spark.sql("""
    SELECT 
        客户编码,
        DATEDIFF(current_date(), MAX(订单日期)) AS R,
        COUNT(DISTINCT 订单编码) AS F,
        SUM(金额) AS M
    FROM sales
    GROUP BY 客户编码
"""))

# 客户分群(示例)
rfm.withColumn("客户等级",
    F.when((F.col("R") < 30) & (F.col("F") > 5), "高价值")
     .otherwise("一般客户"))

4.2 销售漏斗分析

# 各环节转化率计算
conversion = (df.groupBy("客户行为阶段")
              .agg(F.count("*").alias("人数"))
              .withColumn("转化率", 
                  F.col("人数")/F.lag("人数").over(Window.orderBy("行为序列"))))

五、数据可视化技巧

5.1 Pyecharts最佳实践

from pyecharts.charts import Bar
from pyecharts import options as opts

# 创建柱状图
bar = (
    Bar()
    .add_xaxis(["面膜", "口红", "精华"])
    .add_yaxis("销量", [1200, 800, 600])
    .set_global_opts(
        title_opts=opts.TitleOpts(title="商品销量TOP3"),
        toolbox_opts=opts.ToolboxOpts(),
        datazoom_opts=opts.DataZoomOpts()
    )
)
bar.render("sales_top3.html")

5.2 仪表盘制作

from pyecharts.charts import Page

page = Page()
page.add(bar1, bar2, line1, pie1)
page.render("dashboard.html")

六、性能优化建议

  1. 数据分区策略

    • 按日期分区:df.repartition(52, "周数")

    • 合理设置分区数(建议每个分区128MB-1GB)

  2. 缓存常用数据集

    spark_df.cache()  # 内存缓存
    spark_df.persist(StorageLevel.MEMORY_AND_DISK)  # 内存+磁盘
  3. 广播小表

    from pyspark.sql.functions import broadcast
    df.join(broadcast(lookup_df), "key")

七、常见问题解决方案

  1. 日期解析错误

    • 使用pd.to_datetime()errors='coerce'参数

    • 自定义日期解析函数处理特殊格式

  2. 内存不足

    • 调整Spark配置:spark.executor.memory=4g

    • 使用df.sample()进行抽样分析

  3. 数据倾斜

    • 添加随机前缀进行二次聚合

    • 使用salting技术分散热点key

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值