第一章 DataFrame 核心原理
1.1 DataFrame 架构解析
DataFrame 是 Spark SQL 的分布式数据集抽象,具有以下核心特性:
-
结构化数据处理:类似二维表格,每行结构相同
-
惰性求值机制:操作形成逻辑计划,触发行动操作时才执行
-
优化器支持:Catalyst 优化器自动优化执行计划
-
多数据源支持:可读写 JSON、Parquet、JDBC 等
python
复制
下载
from pyspark.sql import SparkSession # 创建Spark会话 spark = SparkSession.builder \ .appName("DataFrameDeepDive") \ .config("spark.sql.shuffle.partitions", "8") \ .getOrCreate() # 从内存数据创建DataFrame data = [("Java", 20000, True), ("Python", 100000, False), ("Scala", 5000, True)] columns = ["language", "users", "is_compiled"] df = spark.createDataFrame(data, schema=columns) # 显示数据结构 df.printSchema()
1.2 Schema 定义最佳实践
Schema 定义方式对比:
方法 | 优点 | 缺点 |
---|---|---|
自动推断 | 开发快速 | 性能开销大,类型可能不准确 |
字符串定义 | 语法简洁 | 缺乏类型校验 |
StructType 精确定义 | 类型安全,支持复杂结构 | 代码量较大 |
python
复制
下载
from pyspark.sql.types import * # 精确Schema定义示例 detailed_schema = StructType([ StructField("id", LongType(), False), StructField("name", StringType(), True), StructField("properties", MapType(StringType(), StringType()), True), StructField("scores", ArrayType(FloatType()), True) ]) # 应用Schema读取数据 df = spark.read.schema(detailed_schema).json("data.json")
第二章 数据操作进阶
2.1 数据探查方法
python
复制
下载
# 基础探查方法 df.show(5, truncate=False) # 显示5行不截断 df.describe().show() # 统计摘要 df.distinct().count() # 去重计数 # 高级分析 df.crosstab("language", "is_compiled").show() # 交叉表 df.stat.corr("users", "is_compiled") # 相关系数
2.2 条件筛选与排序优化
python
复制
下载
from pyspark.sql.functions import col, when # 复合条件筛选 filtered = df.filter( (col("users") > 10000) & (~col("language").isin("PHP", "Perl")) # 多列排序优化 ordered = df.orderBy( col("is_compiled").desc(), col("users").asc())
2.3 列操作模式
python
复制
下载
# 列操作最佳实践 from pyspark.sql.functions import lit, expr df_transformed = (df .withColumn("user_ratio", col("users") / 1000) .withColumn("status", when(col("users") > 50000, "popular") .otherwise("niche")) .withColumnRenamed("is_compiled", "compiled") .drop("obsolete_column"))
第三章 类型系统与转换
3.1 完整类型体系
Spark SQL 类型与 Python 对照表:
Spark SQL 类型 | Python 类型 | 备注 |
---|---|---|
BinaryType | bytearray | 二进制数据 |
TimestampType | datetime.datetime | 时间戳 |
DateType | datetime.date | 日期 |
ArrayType | list | 数组 |
MapType | dict | 字典 |
StructType | namedtuple | 复杂结构 |
3.2 类型安全转换
python
复制
下载
from pyspark.sql.functions import to_date, to_timestamp # 安全类型转换模式 df_safe = (df .withColumn("users_int", col("users").cast(IntegerType())) .withColumn("event_date", to_date(col("date_str"), "yyyy-MM-dd")) .withColumn("event_time", to_timestamp(col("timestamp_str")))) # 处理异常值 df_clean = df.withColumn("valid_users", when(col("users").isNull() | (col("users") < 0), 0) .otherwise(col("users")))
第四章 性能优化技巧
4.1 执行计划分析
python
复制
下载
# 查看逻辑计划 df.explain() # 查看物理计划 df.explain(True) # 优化建议 spark.sql("SET spark.sql.adaptive.enabled=true")
4.2 缓存策略
python
复制
下载
# 缓存级别选择 df.persist(StorageLevel.MEMORY_AND_DISK) # 查看存储情况 spark.catalog.cacheTable("table_name") # 释放缓存 df.unpersist()
第五章 实战应用示例
5.1 数据清洗管道
python
复制
下载
# 完整数据清洗流程 cleaned_df = (spark.read.csv("data.csv", header=True) .na.fill({"age": 0, "income": 50000}) # 填充空值 .filter(col("age") >= 18) # 过滤记录 .withColumn("income_group", # 分箱操作 when(col("income") < 30000, "low") .when(col("income") < 70000, "middle") .otherwise("high")) .groupBy("income_group") # 聚合分析 .agg({"age": "avg", "income": "max"}) .orderBy("avg(age)"))
5.2 复杂类型处理
python
复制
下载
# 处理JSON字符串列 from pyspark.sql.functions import from_json json_schema = StructType([ StructField("name", StringType()), StructField("address", StructType([ StructField("city", StringType()), StructField("zip", StringType()) ])) ]) df_with_json = df.withColumn( "parsed_json", from_json(col("json_str"), json_schema))