You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark如何保留DataFrame指定列而非删除列?

PySpark处理多CSV文件时指定保留列的方法

一、读取阶段直接指定需保留的列(推荐)

这是最高效的做法,Spark只会加载你需要的列,大幅减少IO和内存占用,尤其适合列数极多的场景。

方法1:用自定义Schema读取

如果明确知道目标列的类型,直接定义只包含这些列的Schema,Spark会按Schema解析文件,跳过其他列:

from pyspark.sql.types import StructType, StructField, StringType, IntegerType

# 替换成你要保留的列名和对应类型
custom_schema = StructType([
    StructField("user_id", IntegerType(), nullable=True),
    StructField("order_date", StringType(), nullable=True),
    StructField("total_amount", StringType(), nullable=True)
])

# 用通配符匹配多个CSV文件,比如/data/orders/*.csv
df = spark.read.csv(
    path="/path/to/your/csvs/*.csv",
    schema=custom_schema,
    header=True,  # CSV文件带表头时开启
    inferSchema=False  # 关闭自动推断,用自定义Schema更高效
)

方法2:用usecols参数直接指定列(Spark 3.0+支持)

如果不确定列类型,或者不想写Schema,可以用usecols参数直接指定要保留的列名:

# 替换成你要保留的列名列表
keep_columns = ["user_id", "order_date", "total_amount"]

df = spark.read.csv(
    path="/path/to/your/csvs/*.csv",
    header=True,
    usecols=keep_columns,
    inferSchema=True  # 自动推断目标列的类型
)

二、读取全量列后用select筛选

如果已经读取了包含所有列的DataFrame,直接用select提取目标列即可,生成的新DataFrame只保留需要的列,原DataFrame会被Spark自动回收,无需手动截断:

# 假设已读取全量列的df
keep_columns = ["user_id", "order_date", "total_amount"]
filtered_df = df.select(*keep_columns)

# 后续操作直接使用filtered_df
filtered_df.show()

这里的*是把列表中的列名逐个传入select方法,等价于df.select("user_id", "order_date", "total_amount")。

三、多CSV文件处理注意事项

  • 确保所有CSV文件的表头一致,否则会出现列不匹配的问题;如果表头确实不一致,可以添加option("mergeSchema", True)让Spark自动合并Schema,但建议优先统一文件格式。
  • 递归读取子目录下的CSV:添加option("recursiveFileLookup", True),配合路径/path/to/your/csvs/**/*.csv使用。

内容的提问来源于stack exchange,提问作者user3049941

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:47:46