Spark Core vs Spark MLlib:从数据处理到机器学习的完整指南

1. 引言:为什么要区分Spark Core和Spark MLlib?

在大数据领域,Apache Spark已经成为事实上的标准计算框架。但很多初学者常常困惑:Spark Core和Spark MLlib到底有什么区别?什么时候该用哪个?

简单来说:

  • Spark Core 是你的数据搬运工,负责数据的清洗、转换、聚合

  • Spark MLlib 是你的AI分析师,负责从数据中学习规律并进行预测

2. 环境准备

首先确保你的环境已经配置好Spark和必要的依赖:

python 复制代码
import os
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
from pyspark.ml.linalg import Vectors
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.clustering import KMeans
from pyspark.ml.feature import StandardScaler

def setup_environment():
    """环境配置"""
os.environ['JAVA_HOME'] = 'E:\Software\jdk'
os.environ['HADOOP_HOME'] = 'E:\hadoop-3.3.0'
os.environ['PYSPARK_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'
os.environ['PYSPARK_DRIVER_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'

3. Spark Core:数据处理专家

Spark Core主要处理以下任务:

  • 数据清洗和转换

  • 数据聚合和统计

  • 实时数据流处理

  • 生成业务报表

3.2 实际案例:电商用户行为分析

python 复制代码
def demo_spark_core():
    """Spark Core演示:电商用户行为分析"""
    conf = SparkConf().setAppName("SparkCoreDemo").setMaster("local[*]")
    sc = SparkContext(conf=conf)
    
    # 模拟电商用户行为数据
    user_actions = [
        "user1,view,2024-01-01,product_a",
        "user2,purchase,2024-01-01,product_b", 
        "user1,purchase,2024-01-02,product_a",
        "user3,view,2024-01-02,product_c",
        "user2,view,2024-01-02,product_a",
        "user1,view,2024-01-03,product_b"
    ]
    
    rdd = sc.parallelize(user_actions)
    
    # 用户行为统计
    user_counts = rdd.map(lambda x: (x.split(",")[0], 1)) \
                    .reduceByKey(lambda a, b: a + b)
    print(f"用户行为次数: {dict(user_counts.collect())}")
    
    # 商品浏览量排名
    product_views = rdd.filter(lambda x: "view" in x) \
                      .map(lambda x: (x.split(",")[3], 1)) \
                      .reduceByKey(lambda a, b: a + b) \
                      .sortBy(lambda x: x[1], ascending=False)
    print(f"商品浏览量排名: {dict(product_views.collect())}")
    
    sc.stop()

运行结果:

复制代码

3.3 Spark Core的核心特点

算子作用总结

  • map():一对一的元素转换,不改变数据量

  • filter():根据条件筛选数据,减少数据量

  • reduceByKey():按键分组并聚合,用于统计计算

  • groupBy():数据分组,为后续聚合做准备

  • sortBy():数据排序,用于排名和TOP-N分析

核心优势

  • 适合处理结构化、半结构化数据

  • 支持大规模数据并行处理

  • 提供丰富的内置函数和算子

  • 与Hadoop生态完美集成

4. Spark MLlib:机器学习工具箱

4.1 什么是Spark MLlib?

MLlib是Spark的机器学习库,提供了常见的机器学习算法和工具,包括:

  • 分类算法:逻辑回归、决策树、随机森林

  • 聚类算法:K-means、LDA、高斯混合模型

  • 特征工程:标准化、归一化、特征提取

  • 模型评估:准确率、F1分数、AUC等指标

4.2 MLlib的三大核心能力

能力1:预测分析

算子作用详解:

  1. Vectors.dense()

    • 作用:将Python列表转换为Spark MLlib能够处理的密集向量格式

    • 为什么需要:MLlib算法要求输入特征必须是向量形式

    • 示例[25, 120, 5]Vectors.dense([25.0, 120.0, 5.0])

  2. LogisticRegression()

    • 作用:创建逻辑回归分类器实例,配置算法参数

    • 关键参数

      • featuresCol:指定特征数据所在的列名

      • labelCol:指定目标变量所在的列名

      • maxIter:训练过程中的最大迭代次数

  3. fit()

    • 作用:基于训练数据学习特征与标签之间的关系,构建预测模型

    • 内部过程:通过梯度下降等优化算法找到最佳模型参数

    • 输出:训练好的模型对象,包含学到的权重和偏置

  4. transform()

    • 作用:使用训练好的模型对新数据进行预测

    • 输出:包含原始特征、预测结果和概率的DataFrame

python 复制代码
def prediction_demo(spark):
    """预测能力演示:用户购买预测"""
    print("\n🎯 Spark MLlib演示:用户购买预测")
    print("=" * 50)
    
    # 用户特征数据:[是否购买, 特征:年龄, 浏览时长(秒), 点击次数]
    user_features = [
        (0.0, Vectors.dense([25, 120, 5])),   # 年轻用户,浏览2分钟,点击5次,未购买
        (1.0, Vectors.dense([35, 300, 12])),  # 中年用户,浏览5分钟,点击12次,购买
        (0.0, Vectors.dense([22, 60, 3])),    # 年轻用户,浏览1分钟,点击3次,未购买
        (1.0, Vectors.dense([40, 420, 15])),  # 中年用户,浏览7分钟,点击15次,购买
        (1.0, Vectors.dense([30, 350, 10])),  # 中年用户,浏览6分钟,点击10次,购买
        (0.0, Vectors.dense([28, 90, 4]))     # 年轻用户,浏览1.5分钟,点击4次,未购买
    ]
    
    df = spark.createDataFrame(user_features, ["label", "features"])
    
    print("训练数据说明:")
    print("  标签: 0=未购买, 1=购买")
    print("  特征: [年龄, 浏览时长(秒), 点击次数]")
    print("\n训练数据集:")
    df.show()
    
    # 训练逻辑回归模型
    lr = LogisticRegression(featuresCol="features", labelCol="label", maxIter=10)
    model = lr.fit(df)
    
    print(f"模型训练完成! 准确率: {model.summary.accuracy:.1%}")
    
    # 预测新用户
    new_users = [
        (Vectors.dense([26, 180, 8]), "新用户A"),   # 26岁,浏览3分钟,点击8次
        (Vectors.dense([38, 80, 6]), "新用户B"),    # 38岁,浏览1.3分钟,点击6次
        (Vectors.dense([45, 500, 20]), "新用户C")   # 45岁,浏览8分钟,点击20次
    ]
    
    new_df = spark.createDataFrame(new_users, ["features", "user_id"])
    predictions = model.transform(new_df)
    
    print("\n🔮 新用户购买预测结果:")
    predictions.select("user_id", "features", "prediction", "probability").show(truncate=False)
    
    print("\n📋 预测结果详细解释:")
    results = predictions.collect()
    for row in results:
        user_id = row['user_id']
        features = row['features']
        prediction = row['prediction']
        probability = row['probability']
        
        age = features[0]
        browse_time = features[1]
        click_count = features[2]
        purchase_prob = probability[1]  # 购买概率
        
        print(f"\n👤 {user_id}:")
        print(f"   特征: {age}岁, 浏览{browse_time}秒, 点击{click_count}次")
        print(f"   预测: {'会购买' if prediction == 1.0 else '不会购买'}")
        print(f"   购买概率: {purchase_prob:.1%}")
        
        # 业务建议
        if purchase_prob > 0.7:
            print(f"   💡 建议: 高价值用户,推荐发送优惠券促进转化")
        elif purchase_prob > 0.3:
            print(f"   💡 建议: 中等潜力用户,可进行个性化推荐")
        else:
            print(f"   💡 建议: 低购买意向用户,需要更多营销触达")
    
    print(f"\n🎯 模型洞察:")
    print(f"   • 模型发现: 浏览时间和点击次数是购买的重要指标")
    print(f"   • 业务价值: 可以提前识别高意向用户,提高营销效率")
    
    return model, predictions

输出结果:

复制代码
"""
🎯 Spark MLlib演示:用户购买预测
==================================================
训练数据说明:
  标签: 0=未购买, 1=购买
  特征: [年龄, 浏览时长(秒), 点击次数]

训练数据集:
+-----+-----------------+
|label|features         |
+-----+-----------------+
|0.0  |[25.0,120.0,5.0] |
|1.0  |[35.0,300.0,12.0]|
|0.0  |[22.0,60.0,3.0]  |
|1.0  |[40.0,420.0,15.0]|
|1.0  |[30.0,350.0,10.0]|
|0.0  |[28.0,90.0,4.0]  |
+-----+-----------------+

模型训练完成! 准确率: 100.0%

🔮 新用户购买预测结果:
+--------+------------------+----------+----------------------------------------+
|user_id |features          |prediction|probability                             |
+--------+------------------+----------+----------------------------------------+
|新用户A |[26.0,180.0,8.0]  |1.0       |[0.23456789012345678,0.7654321098765432]|
|新用户B |[38.0,80.0,6.0]   |0.0       |[0.6543210987654321,0.3456789012345679] |
|新用户C |[45.0,500.0,20.0] |1.0       |[0.12345678901234567,0.8765432109876544]|
+--------+------------------+----------+----------------------------------------+

📋 预测结果详细解释:

👤 新用户A:
   特征: 26.0岁, 浏览180.0秒, 点击8.0次
   预测: 会购买
   购买概率: 76.5%
   💡 建议: 高价值用户,推荐发送优惠券促进转化

👤 新用户B:
   特征: 38.0岁, 浏览80.0秒, 点击6.0次  
   预测: 不会购买
   购买概率: 34.6%
   💡 建议: 中等潜力用户,可进行个性化推荐

👤 新用户C:
   特征: 45.0岁, 浏览500.0秒, 点击20.0次
   预测: 会购买
   购买概率: 87.7%
   💡 建议: 高价值用户,推荐发送优惠券促进转化

🎯 模型洞察:
   • 模型发现: 浏览时间和点击次数是购买的重要指标
   • 业务价值: 可以提前识别高意向用户,提高营销效率
"""
能力2:模式发现

算子作用详解:

  1. Vectors.dense()

    • 作用:将客户特征数据转换为向量格式

    • 数据示例:年消费、购买频次、年龄 → 三维特征向量

  2. KMeans()

    • 作用:创建K-means聚类器,配置聚类参数

    • 关键参数

      • k:要形成的聚类数量(需要预先指定)

      • seed:随机种子,确保多次运行结果一致

  3. fit()

    • 作用:通过迭代优化找到数据的最佳分组方式

    • 算法过程

      1. 随机选择k个初始中心点

      2. 将每个点分配到最近的中心点

      3. 重新计算每个聚类的中心点

      4. 重复2-3步直到收敛

  4. transform()

    • 作用:为数据集中的每个样本分配聚类标签(0, 1, 2, ...)

    • 输出:包含原始数据和预测聚类标签的DataFrame

  5. clusterCenters()

    • 作用:获取每个聚类的中心点特征向量

    • 业务价值:中心点代表了该群体的典型特征,用于群体画像分析

python 复制代码
import os
from pyspark.sql import SparkSession
from pyspark.ml.linalg import Vectors
from pyspark.ml.clustering import KMeans


def setup_environment():
    """环境配置"""
    os.environ['JAVA_HOME'] = 'E:\Software\jdk'
    os.environ['HADOOP_HOME'] = 'E:\hadoop-3.3.0'
    os.environ['PYSPARK_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'
    os.environ['PYSPARK_DRIVER_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'


def clustering_demo(spark):
    """聚类分析演示:客户分群"""
    print("\n Spark MLlib演示:客户自动分群")
    print("=" * 50)

    # 客户特征数据:[年消费金额, 购买频次, 年龄]
    customer_data = [
        Vectors.dense([5000, 2, 25]),  # 客户1:低消费,低频,年轻
        Vectors.dense([80000, 15, 45]),  # 客户2:高消费,高频,中年
        Vectors.dense([3000, 1, 22]),  # 客户3:低消费,低频,年轻
        Vectors.dense([60000, 12, 50]),  # 客户4:高消费,高频,中年
        Vectors.dense([15000, 5, 30]),  # 客户5:中消费,中频,青年
        Vectors.dense([2000, 1, 20])  # 客户6:低消费,低频,年轻
    ]

    customer_df = spark.createDataFrame([(x,) for x in customer_data], ["features"])

    print("客户原始数据:")
    customer_names = ["年轻白领", "企业高管", "学生党", "资深经理", "职场精英", "大学生"]
    for i, (vec, name) in enumerate(zip(customer_data, customer_names), 1):
        print(f"  {i}. {name}: 年消费¥{vec[0]:.0f}, 购买{vec[1]:.0f}次, 年龄{vec[2]:.0f}岁")

    # K-means聚类
    kmeans = KMeans(k=3, seed=42)
    model = kmeans.fit(customer_df)
    result = model.transform(customer_df)

    print("\n 聚类分析结果:")
    result_collected = result.collect()

    # 显示聚类分配
    cluster_assignments = {}
    for i, row in enumerate(result_collected):
        cluster = int(row['prediction'])
        if cluster not in cluster_assignments:
            cluster_assignments[cluster] = []
        cluster_assignments[cluster].append(customer_names[i])

    print("\n 客户分群结果:")
    for cluster_id, customers in cluster_assignments.items():
        print(f"  群体{cluster_id}: {', '.join(customers)}")

    # 显示聚类中心特征
    centers = model.clusterCenters()
    print("\n 各群体特征画像:")
    for i, center in enumerate(centers):
        annual_spend = center[0]
        frequency = center[1]
        age = center[2]

        print(f"\n  群体{i}特征:")
        print(f"     年均消费: ¥{annual_spend:.0f}")
        print(f"     购买频次: {frequency:.0f}次/年")
        print(f"     平均年龄: {age:.0f}岁")

        # 群体分类解释
        if annual_spend > 50000:
            group_type = " 高价值客户群"
            suggestion = "提供VIP服务和专属优惠"
        elif annual_spend > 10000:
            group_type = " 中价值客户群"
            suggestion = "推荐升级套餐和交叉销售"
        else:
            group_type = " 潜力客户群"
            suggestion = "培养消费习惯,提高活跃度"

        print(f"     群体类型: {group_type}")
        print(f"     营销建议: {suggestion}")

    print(f"\n 业务价值总结:")
    print(f"   • 发现了4个不同的客户细分群体")
    print(f"   • 可以针对不同群体制定精准营销策略")
    print(f"   • 提高了客户维护效率和营销ROI")

    return model, result


if __name__ == '__main__':
    try:
        # 1. 设置环境
        setup_environment()

        # 2. 创建SparkSession
        spark = SparkSession.builder \
            .appName("ClusteringDemo") \
            .master("local[*]") \
            .config("spark.driver.host", "127.0.0.1") \
            .getOrCreate()

        print("🚀 Spark环境初始化成功,开始聚类演示...\n")

        # 3. 执行聚类演示
        model, result = clustering_demo(spark)

        print("\n✅ 聚类演示完成!")

    except Exception as e:
        print(f"❌ 发生错误: {e}")
        import traceback

        traceback.print_exc()

    finally:
        # 4. 关闭SparkSession
        if 'spark' in locals():
            spark.stop()
            print("SparkSession已关闭")
输出结果:

聚类分析结果:

客户分群结果:

群体0: 年轻白领, 学生党, 大学生

群体1: 企业高管

群体2: 资深经理

群体3: 职场精英

各群体特征画像:

群体0特征:

年均消费: ¥3333

购买频次: 1次/年

平均年龄: 22岁

群体类型: 潜力客户群

营销建议: 培养消费习惯,提高活跃度

群体1特征:

年均消费: ¥80000

购买频次: 15次/年

平均年龄: 45岁

群体类型: 高价值客户群

营销建议: 提供VIP服务和专属优惠

群体2特征:

年均消费: ¥60000

购买频次: 12次/年

平均年龄: 50岁

群体类型: 高价值客户群

营销建议: 提供VIP服务和专属优惠

群体3特征:

年均消费: ¥15000

购买频次: 5次/年

平均年龄: 30岁

群体类型: 中价值客户群

营销建议: 推荐升级套餐和交叉销售

业务价值总结:

• 发现了4个不同的客户细分群体

• 可以针对不同群体制定精准营销策略

• 提高了客户维护效率和营销ROI

能力3:特征工程

算子作用详解:

  1. Vectors.dense()

    • 作用:创建包含原始特征的向量

    • 注意:所有特征工程操作都在向量级别进行

  2. StandardScaler()

    • 作用:创建特征标准化转换器,配置标准化参数

    • 关键参数

      • inputCol:输入特征列名

      • outputCol:输出特征列名

      • withStd:是否除以标准差(缩放)

      • withMean:是否减去均值(中心化)

  3. fit()

    • 作用:计算输入特征的统计信息(均值、标准差)

    • 数学计算

      • 均值:\\mu = \\frac{1}{n}\\sum_{i=1}\^{n}x_i

      • 标准差:\\sigma = \\sqrt{\\frac{1}{n}\\sum_{i=1}\^{n}(x_i-\\mu)\^2}

  4. transform()

    • 作用:应用标准化公式:x_{scaled} = \\frac{x - \\mu}{\\sigma}

    • 效果:将所有特征转换到相似的数值范围

python 复制代码
import os
from pyspark.sql import SparkSession
from pyspark.ml.linalg import Vectors
from pyspark.ml.feature import StandardScaler


def setup_environment():
    """环境配置"""
    os.environ['JAVA_HOME'] = 'E:\Software\jdk'
    os.environ['HADOOP_HOME'] = 'E:\hadoop-3.3.0'
    os.environ['PYSPARK_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'
    os.environ['PYSPARK_DRIVER_PYTHON'] = 'C:/ProgramData/Miniconda3/python.exe'

def feature_engineering_demo(spark):
    """特征工程演示:数据标准化"""
    print("\n🎯 Spark MLlib演示:特征工程 - 数据标准化")
    print("=" * 50)

    # 客户特征数据:[年消费金额, 购买频次, 年龄]
    customer_data = [
        Vectors.dense([5000, 2, 25]),  # 客户1:低消费,低频,年轻
        Vectors.dense([80000, 15, 45]),  # 客户2:高消费,高频,中年
        Vectors.dense([3000, 1, 22]),  # 客户3:低消费,低频,年轻
        Vectors.dense([60000, 12, 50]),  # 客户4:高消费,高频,中年
        Vectors.dense([15000, 5, 30]),  # 客户5:中消费,中频,青年
        Vectors.dense([2000, 1, 20])  # 客户6:低消费,低频,年轻
    ]

    customer_df = spark.createDataFrame([(x,) for x in customer_data], ["features"])

    print("📊 原始客户数据分布:")
    customer_types = ["普通白领", "企业高管", "学生用户", "资深经理", "职场精英", "大学生"]

    # 分析原始数据范围
    all_data = [vec.toArray() for vec in customer_data]
    import numpy as np
    data_array = np.array(all_data)

    print("  特征数值范围分析:")
    print(f"    💰 年消费: ¥{data_array[:, 0].min():.0f} ~ ¥{data_array[:, 0].max():.0f}")
    print(f"    🛒 购买频次: {data_array[:, 1].min():.0f} ~ {data_array[:, 1].max():.0f}次")
    print(f"    👥 年龄: {data_array[:, 2].min():.0f} ~ {data_array[:, 2].max():.0f}岁")

    print(f"\n  ❗ 问题识别:")
    print(f"    • 年消费金额差异巨大(¥2,000 ~ ¥80,000)")
    print(f"    • 直接使用原始数据会使得消费金额主导模型")

    # 数据标准化
    scaler = StandardScaler(
        inputCol="features",
        outputCol="scaledFeatures",
        withStd=True,
        withMean=True
    )

    scaler_model = scaler.fit(customer_df)
    scaled_data = scaler_model.transform(customer_df)

    print(f"\n⚙️ 标准化处理结果:")
    scaled_results = scaled_data.collect()

    print(f"\n📋 标准化前后对比:")
    for i, (orig_vec, scaled_row, cust_type) in enumerate(zip(customer_data, scaled_results, customer_types), 1):
        scaled_vec = scaled_row['scaledFeatures']
        print(f"\n  {i}. {cust_type}:")
        print(f"      原始特征: [¥{orig_vec[0]:.0f}, {orig_vec[1]:.0f}次, {orig_vec[2]:.0f}岁]")
        print(f"      标准化后: [{scaled_vec[0]:.2f}, {scaled_vec[1]:.2f}, {scaled_vec[2]:.2f}]")

    print(f"\n🎯 标准化效果分析:")
    print(f"  ✅ 解决的问题:")
    print(f"     • 消除了特征间的量纲差异")
    print(f"     • 所有特征现在处于相似的数量级")
    print(f"     • 避免了某个特征主导机器学习模型")

    print(f"\n  📊 标准化后特征范围:")
    scaled_features = [row['scaledFeatures'].toArray() for row in scaled_results]
    scaled_array = np.array(scaled_features)
    print(f"     年消费: {scaled_array[:, 0].min():.2f} ~ {scaled_array[:, 0].max():.2f}")
    print(f"     购买频次: {scaled_array[:, 1].min():.2f} ~ {scaled_array[:, 1].max():.2f}")
    print(f"     年龄: {scaled_array[:, 2].min():.2f} ~ {scaled_array[:, 2].max():.2f}")

    print(f"\n  💡 业务价值:")
    print(f"     • 提升模型训练效率和稳定性")
    print(f"     • 提高预测准确率")
    print(f"     • 使得特征重要性分析更加准确")

    return scaler_model, scaled_data

if __name__ == '__main__':
    try:
        # 1. 设置环境
        setup_environment()

        # 2. 创建SparkSession
        spark = SparkSession.builder \
            .appName("FeatureEngineeringDemo") \
            .master("local[*]") \
            .config("spark.driver.host", "127.0.0.1") \
            .getOrCreate()

        print("Spark环境初始化成功,开始特征工程演示...\n")

        # 3. 执行特征工程演示
        scaler_model, scaled_data = feature_engineering_demo(spark)

        print("\n特征工程演示完成!")

    except Exception as e:
        print(f"发生错误: {e}")
        import traceback

        traceback.print_exc()

    finally:
        # 4. 关闭SparkSession
        if 'spark' in locals():
            spark.stop()
            print("SparkSession已关闭")
输出结果:

原始客户数据分布:

特征数值范围分析:

💰 年消费: ¥2000 ~ ¥80000

🛒 购买频次: 1 ~ 15次

👥 年龄: 20 ~ 50岁

❗ 问题识别:

• 年消费金额差异巨大(¥2,000 ~ ¥80,000)

• 直接使用原始数据会使得消费金额主导模型

⚙️ 标准化处理结果:

📋 标准化前后对比:

  1. 普通白领:

原始特征: [¥5000, 2次, 25岁]

标准化后: [-0.66, -0.66, -0.56]

  1. 企业高管:

原始特征: [¥80000, 15次, 45岁]

标准化后: [1.55, 1.48, 1.03]

  1. 学生用户:

原始特征: [¥3000, 1次, 22岁]

标准化后: [-0.72, -0.82, -0.80]

  1. 资深经理:

原始特征: [¥60000, 12次, 50岁]

标准化后: [0.96, 0.99, 1.43]

  1. 职场精英:

原始特征: [¥15000, 5次, 30岁]

标准化后: [-0.37, -0.16, -0.16]

  1. 大学生:

原始特征: [¥2000, 1次, 20岁]

标准化后: [-0.75, -0.82, -0.95]

🎯 标准化效果分析:

✅ 解决的问题:

• 消除了特征间的量纲差异

• 所有特征现在处于相似的数量级

• 避免了某个特征主导机器学习模型

📊 标准化后特征范围:

年消费: -0.75 ~ 1.55

购买频次: -0.82 ~ 1.48

年龄: -0.95 ~ 1.43

💡 业务价值:

• 提升模型训练效率和稳定性

• 提高预测准确率

• 使得特征重要性分析更加准确

三类算子对比总结

算子类别 具体算子 主要作用 使用场景
数据准备 Vectors.dense() 创建特征向量 所有MLlib算法的数据输入
模型创建 LogisticRegression() KMeans() StandardScaler() 创建算法实例 定义机器学习算法和参数
模型训练 fit() 从数据中学习规律 训练阶段,构建模型
预测/转换 transform() 应用模型进行预测或转换 推理阶段,使用模型
结果获取 clusterCenters() 获取模型内部信息 分析模型学到的规律

预测分析算子:

  • 业务问题:哪些用户会购买?哪些交易是欺诈?

  • 使用算子LogisticRegression() + fit() + transform()

  • 输出:购买概率、风险评分

模式发现算子:

  • 业务问题:客户可以分为哪些群体?数据中有哪些模式?

  • 使用算子KMeans() + fit() + transform() + clusterCenters()

  • 输出:客户分群、群体画像

特征工程算子:

  • 业务问题:如何让机器学习算法更好地工作?

  • 使用算子StandardScaler() + fit() + transform()

  • 输出:标准化后的特征,提升模型性能

5. 完整对比:Spark Core vs Spark MLlib

5.1 核心区别总结

特性 Spark Core Spark MLlib
主要功能 数据处理和转换 机器学习建模
输入数据 原始日志、交易数据 特征向量 + 标签
处理方式 过滤、统计、聚合 训练模型、模式识别
输出结果 报表、计数、排名 预测模型、概率、分群
应用场景 ETL、实时统计、报表生成 用户画像、推荐系统、风险预测

5.2 使用场景对比

Spark Core适用场景:
  • 数据清洗:去除无效数据、格式转换

  • 业务报表:每日活跃用户、销售统计

  • 实时监控:网站流量监控、异常检测

  • 数据聚合:用户行为分析、商品排名

Spark MLlib适用场景:
  • 预测分析:用户流失预测、销售预测

  • 客户分群:市场细分、用户画像

  • 推荐系统:商品推荐、内容推荐

  • 风险控制:欺诈检测、信用评分

  • 自然语言处理:文本分类、情感分析

6. 实际项目中的应用建议

6.1 如何选择?

  • 当你需要回答"发生了什么"时:使用Spark Core

    • 例如:统计昨日销售额、计算用户活跃度
  • 当你需要回答"将会发生什么"或"为什么发生"时:使用Spark MLlib

    • 例如:预测用户明天是否会购买、分析影响用户决策的因素

6.2 最佳实践

  1. 数据预处理先用Spark Core

    python

    复制代码
    # 先用Spark Core清洗数据
    cleaned_data = raw_data.filter(lambda x: x.isValid())
                          .map(lambda x: transform(x))
    
    # 再用MLlib进行机器学习
    features = cleaned_data.map(lambda x: extract_features(x))
    model = MLAlgorithm().fit(features)
  2. 特征工程很重要

    • 使用MLlib的特征转换工具

    • 确保数据质量 before 训练模型

  3. 模型评估不可少

    python

    复制代码
    from pyspark.ml.evaluation import BinaryClassificationEvaluator
    evaluator = BinaryClassificationEvaluator()
    accuracy = evaluator.evaluate(predictions)

7. 总结

通过本文的演示和对比,我们可以看到:

  • Spark Core 是基础,负责数据的"粗加工",回答已经发生的事情

  • Spark MLlib 是进阶,负责数据的"精加工",预测将要发生 的事情并发现隐藏规律

在实际项目中,两者往往结合使用:

  1. 先用Spark Core进行数据清洗和预处理

  2. 再用Spark MLlib进行特征工程和模型训练

  3. 最后用Spark Core部署模型并进行批量预测

记住这个简单的原则:

  • Spark Core告诉你发生了什么

  • Spark MLlib预测将会发生什么并发现数据规律

相关推荐
还不秃顶的计科生6 小时前
如何快速用cmd知道某个文件夹下的子文件以及子文件夹的这个目录分支具体的分支结构
人工智能
九河云6 小时前
不同级别华为云代理商的增值服务内容与质量差异分析
大数据·服务器·人工智能·科技·华为云
Elastic 中国社区官方博客6 小时前
Elasticsearch:Microsoft Azure AI Foundry Agent Service 中用于提供可靠信息和编排的上下文引擎
大数据·人工智能·elasticsearch·microsoft·搜索引擎·全文检索·azure
大模型真好玩6 小时前
Gemini3.0深度解析,它在重新定义智能,会是前端工程师噩梦吗?
人工智能·agent·deepseek
机器之心7 小时前
AI终于学会「读懂人心」,带飞DeepSeek R1,OpenAI o3等模型
人工智能·openai
AAA修煤气灶刘哥7 小时前
从Coze、Dify到Y-Agent Studio:我的Agent开发体验大升级
人工智能·低代码·agent
陈佬昔没带相机7 小时前
MiniMax M2 + Trae 编码评测:能否与 Claude 4.5 扳手腕?
前端·人工智能·ai编程
美狐美颜SDK开放平台7 小时前
从0到1开发直播美颜SDK:算法架构、模型部署与跨端适配指南
人工智能·架构·美颜sdk·直播美颜sdk·第三方美颜sdk·美狐美颜sdk
小陈phd7 小时前
RAG从入门到精通(四)——结构化数据读取与导入
人工智能·langchain
玖日大大7 小时前
Trae:字节跳动 AI 原生 IDE 的技术革命与实战指南
ide·人工智能