Spark 是一个 快速处理海量数据 的工具,用 Python 写代码就能轻松分析 TB 级的数据(比如日志、用户行为、交易记录等),比传统单机工具(如 Excel、Pandas)快几十倍甚至几百倍!
假设你有一个 图书馆,里面有 1亿本书,你需要统计:
如果用普通电脑的 Excel 或 Python 单机处理:
Spark 的作用:
把数据拆分成小块,分给多台电脑同时计算(分布式计算),最后汇总结果,轻松搞定海量数据!
速度快
内存计算 + 多机器并行,比传统 Hadoop 快 100 倍。
易用性
用 Python(PySpark)写代码,语法类似 Pandas,小白也能上手。
通用性
支持数据分析、机器学习、实时计算、图计算等。
容错性
如果某台电脑宕机,Spark 会自动恢复数据,保证任务不中断。
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("example").getOrCreate()
# 读取 100GB 的 CSV 文件(普通电脑根本打不开)
df = spark.read.csv("user_purchases.csv", header=True)
# 统计每个用户的购买总金额
result = df.groupBy("user_id").sum("amount")
result.show() from pyspark.ml.recommendation import ALS
# 训练一个协同过滤模型
als = ALS(maxIter=10, regParam=0.01, userCol="user_id", itemCol="book_id", ratingCol="rating")
model = als.fit(data)
# 预测用户 1001 可能喜欢的书
predictions = model.recommendForUserSubset(user_ids, 5) from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("realtime").getOrCreate()
# 从 Kafka 读取实时数据流
df = spark.readStream.format("kafka").option("kafka.bootstrap.servers", "localhost:9092").load()
# 按分钟统计点击量
clicks_per_minute = df.groupBy(window("timestamp", "1 minute")).count()
# 输出到屏幕
clicks_per_minute.writeStream.outputMode("complete").format("console").start().awaitTermination() # 合并所有 CSV 文件
df = spark.read.csv("data/*.csv", header=True)
# 去重
df = df.dropDuplicates()
# 过滤无效年龄(比如年龄 > 100)
df = df.filter(df.age <= 100)
# 保存结果
df.write.parquet("cleaned_data.parquet") 分布式存储
数据被切分到多台机器(如 HDFS、Amazon S3)。
分布式计算
Spark 把任务拆成小任务(Task),分给多台机器并行执行。
内存计算
数据尽量放在内存中,减少磁盘读写,速度更快。
# 只需一行命令
pip install pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local[4]").appName("test").getOrCreate()
# 测试一个小数据集
data = [("Alice", 34), ("Bob", 45), ("Cathy", 29)]
df = spark.createDataFrame(data, ["name", "age"])
df.show()
Q:Spark 和 Hadoop 有什么区别?
A:Hadoop 用磁盘计算,适合离线批处理;Spark 用内存计算,更快,且支持实时计算。
Q:为什么用 Python(PySpark)而不用 Scala?
A:Python 更简单,适合数据分析师和初学者;Scala 性能更好,适合工程师。
Q:单机电脑能跑 Spark 吗?
A:可以!本地模式(local mode)用线程模拟分布式,适合学习和测试。
Q:Spark 需要多少内存?
A:本地测试 8GB 够用,生产环境通常需要 64GB 以上 + 多台机器。
df.withColumn())。groupBy() 和 filter()!