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
相关产品推荐
相关产品推荐

