如何在PySpark中移除文本文件的首行与末行?
嘿,针对你要移除文件首行和末行的需求,这里给你几个PySpark下的实用方案,完美适配你用spark.read.csv加载数据的场景:
方案1:通过行号过滤(适合中小规模数据)
这个方法简单直接,先给每一行加上递增行号,再过滤掉首行和末行就行。注意一定要指定分隔符为|,不然Spark会把整行当成一列处理,另外别把无效的首行设为表头:
from pyspark.sql.functions import monotonically_increasing_id # 加载文件,指定分隔符,不将首行作为表头 df = spark.read.format('csv') \ .option('delimiter', '|') \ .option('header', 'false') \ .load('sample.txt') \ .withColumn("row_num", monotonically_increasing_id()) # 获取总行数,用来定位末行 total_rows = df.count() # 过滤掉首行(row_num=0)和末行(row_num=总行数-1),再删除行号列 filtered_df = df.filter((df.row_num != 0) & (df.row_num != total_rows - 1)) \ .drop("row_num") # 可选:给列起个有意义的名字 filtered_df = filtered_df.toDF("id", "type", "category", "value")
小提醒:monotonically_increasing_id()在单文件/单分区场景下会生成连续行号,但如果数据分布在多个分区,行号可能不连续,这时候可以用下面的方案。
方案2:用窗口函数精准过滤(适合分布式/大规模数据)
如果你的数据是分布式存储的,用全局窗口生成连续行号会更准确,避免分区导致的行号不连续问题:
from pyspark.sql.window import Window from pyspark.sql.functions import row_number, lit # 加载文件,同样指定分隔符和不启用表头 df = spark.read.format('csv') \ .option('delimiter', '|') \ .option('header', 'false') \ .load('sample.txt') # 定义全局窗口,确保行号全局连续 window_spec = Window.orderBy(lit(1)) # 添加全局连续行号 df_with_row = df.withColumn("row_num", row_number().over(window_spec)) # 获取总行数 total_rows = df_with_row.count() # 过滤首行(row_num=1)和末行(row_num=总行数),删除行号列 filtered_df = df_with_row.filter((df_with_row.row_num != 1) & (df_with_row.row_num != total_rows)) \ .drop("row_num") # 可选:重命名列 filtered_df = filtered_df.toDF("id", "type", "category", "value")
方案3:RDD层面直接处理(灵活高效)
如果文件规模不大,也可以先把文件读成RDD,直接过滤首尾行再转成DataFrame,操作更灵活:
# 读取文件为RDD rdd = spark.sparkContext.textFile('sample.txt') # 获取总行数 total_lines = rdd.count() # 给每行加索引,过滤掉第1行(索引0)和最后一行(索引=总行数-1),再提取内容 filtered_rdd = rdd.zipWithIndex() \ .filter(lambda x: x[1] != 0 and x[1] != total_lines - 1) \ .map(lambda x: x[0]) # 将RDD转成DataFrame,按|分割列 filtered_df = filtered_rdd.map(lambda line: line.split('|')).toDF(["id", "type", "category", "value"])
关键注意事项:原文件的首行和末行列数和中间有效行不一致,所以必须设置header=False,否则Spark会把首行识别为表头,导致后续列数不匹配报错。
内容的提问来源于stack exchange,提问作者Selvakumar
相关产品推荐
相关产品推荐

