从 pyspark 中的文本文件中删除第一行和最后一行

Remove first and last row from the text file in pyspark

我有如下文件

H201908127477474
123|sample|customer|3433
786|ex|data|7474737
987|solve|data|6364
T3 637373

我想从文件中删除第一行和最后一行。请在 pyspark

中给我一些解决方案

我正在使用它来加载文件

df=spark.read.format('csv').load('sample.txt')

没有简单的方法可以按行号删除行,因为默认情况下 Spark DataFrames 没有顺序的概念1。没有 "first" 或 "last" 行 - 每行都被视为一个独立的结构化数据块。这是 spark 的基础,也是允许它进行 distribute/parallelize 计算的原因——每个执行者都可以获取任意数据块和进程。

尽管您的问题询问如何删除第一行和最后一行,但我认为您真正想要的是保留遵循正确模式的数据。

如果您提前知道正确的模式,您可以将其传递给 spark.read.csv 并使用 mode="DROPMALFORMED":

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

schema = StructType(
    [
        StructField('a', IntegerType()),
        StructField('b', StringType()),
        StructField('c', StringType()),
        StructField('d', IntegerType())
    ]
)
df = spark.read.csv('sample.txt', sep="|", mode="DROPMALFORMED", schema=schema)
#+---+------+--------+-------+
#|  a|     b|       c|      d|
#+---+------+--------+-------+
#|123|sample|customer|   3433|
#|786|    ex|    data|7474737|
#|987| solve|    data|   6364|
#+---+------+--------+-------+

备注:

  1. 您可以通过 sortWindow 函数引入顺序。请参阅:(并查看问题中链接的帖子)。

  2. 如果你真的想删除第一行和最后一行,你可以,并用它来过滤掉最小和最大的行号。