Spark 是当前最流行的大数据计算引擎,相比 Hadoop MapReduce 性能提升 10~100 倍。本文从零搭建 Spark 开发环境,用 Python 编写第一个 Spark 程序。
一、Spark 是什么
Spark 是一个分布式计算框架,可以在成百上千台服务器上并行处理数据。
| 对比 | Hadoop MapReduce | Spark |
|---|---|---|
| 计算速度 | 慢(磁盘读写) | 快 10~100 倍(内存计算) |
| 易用性 | Java 编写,代码量大 | Python/Java/Scala 均可 |
| 适用场景 | 离线批处理 | 批处理 + SQL + 流处理 + 机器学习 |
二、环境搭建
1. 安装 Spark(Windows/Linux)
bash
# 1. 下载 Spark(需预装 Java 8+)
wget https://dlcdn.apache.org/spark/spark-3.5.0/spark-3.5.0-bin-hadoop3.tgz
# 2. 解压
tar -xzf spark-3.5.0-bin-hadoop3.tgz
mv spark-3.5.0-bin-hadoop3 /opt/spark
# 3. 配置环境变量
export SPARK_HOME=/opt/spark
export PATH=$PATH:$SPARK_HOME/bin
2. 安装 PySpark
bash
pip install pyspark
3. 验证安装
bash
# 进入 Spark Shell(交互式环境)
pyspark
# 看到这个界面说明安装成功
# Welcome to Spark version 3.5.0
三、核心概念
| 概念 | 说明 |
|---|---|
| RDD | 弹性分布式数据集,Spark 的核心抽象 |
| DataFrame | 带列名的分布式数据集(类似 Pandas) |
| SparkSession | Spark 应用的入口 |
| Task | 任务,被发送到 executor 执行 |
| Partition | 数据分区,每个分区对应一个 task |
四、第一个 Spark 程序
1. 读取数据
python
from pyspark.sql import SparkSession
# 创建 SparkSession
spark = SparkSession.builder \
.appName("FirstSparkApp") \
.getOrCreate()
# 读取 CSV 文件
df = spark.read.csv("students.csv", header=True, inferSchema=True)
# 查看数据
df.show(5)
df.printSchema()
2. 数据转换
python
from pyspark.sql.functions import col, avg, count
# 筛选成绩大于 60 分的学生
df.filter(col("score") > 60).show()
# 按班级分组统计平均分
df.groupBy("class_name") \
.agg(avg("score").alias("avg_score"),
count("*").alias("student_count")) \
.orderBy("avg_score", ascending=False) \
.show()
五、实战:学生成绩统计分析
python
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, avg, max, min, count, when
# 创建会话
spark = SparkSession.builder.appName("ScoreAnalysis").getOrCreate()
# 读取数据
df = spark.read.csv("scores.csv", header=True, inferSchema=True)
# 1. 数据概览
print(f"总记录数: {df.count()}")
df.describe().show()
# 2. 各班级平均分
df.groupBy("class") \
.agg(avg("score").alias("平均分"),
max("score").alias("最高分"),
min("score").alias("最低分")) \
.orderBy("平均分", ascending=False) \
.show()
# 3. 成绩分布
df.withColumn("等级",
when(col("score") >= 90, "优秀")
.when(col("score") >= 80, "良好")
.when(col("score") >= 70, "中等")
.when(col("score") >= 60, "及格")
.otherwise("不及格")
).groupBy("等级").agg(count("*").alias("人数")) \
.orderBy("等级").show()
spark.stop()
六、Spark SQL
Spark 支持用 SQL 语句查询数据,适合熟悉 SQL 的开发者:
python
# 将 DataFrame 注册为临时表
df.createOrReplaceTempView("students")
# 用 SQL 查询
result = spark.sql("""
SELECT class_name,
ROUND(AVG(score), 2) as avg_score,
COUNT(*) as count
FROM students
WHERE score >= 60
GROUP BY class_name
ORDER BY avg_score DESC
""")
result.show()
七、性能优化建议
1. 合理设置分区数
python
# 默认分区数偏小,大数据量时调整
spark.conf.set("spark.sql.shuffle.partitions", "200")
2. 使用缓存
python
# 频繁使用的数据缓存到内存
df.cache()
# 或
df.persist()
3. 避免使用 UDF
python
# ❌ 慢:使用 Python UDF
from pyspark.sql.functions import udf
# ✅ 快:使用内置函数
from pyspark.sql.functions import when, col
总结
Spark 是大数据领域的核心技术,掌握它之后处理海量数据不再是难题。记住三步:
- 创建 SparkSession ------ 入口
- 读取数据 ------
spark.read.csv/json/parquet - 数据转换 ------
filter、groupBy、agg等操作
💡 觉得有用的话,点赞 + 关注【张老师技术栈】吧!每周更新 Java/Python/爬虫 大数据 实战干货,不让你白来。