PySpark DataFrame 核心概念与操作指南

第一章 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 类型备注
BinaryTypebytearray二进制数据
TimestampTypedatetime.datetime时间戳
DateTypedatetime.date日期
ArrayTypelist数组
MapTypedict字典
StructTypenamedtuple复杂结构

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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值