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

Posted

技术标签:

【中文标题】从pyspark中的文本文件中删除第一行和最后一行【英文标题】:Remove first and last row from the text file in pyspark 【发布时间】:2019-09-09 15:36:42 【问题描述】:

我有如下文件

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

我想从文件中删除第一行和最后一行。请在 pyspark 中给我一些解决方案

我正在使用它来加载文件

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

【问题讨论】:

需要从文件中删除 H201908127477474 和 T3 637373 行 它不会专门删除第一行和最后一行,但df = spark.read.csv('sample.txt', sep="|", mode="DROPMALFORMED") 在这种情况下可能对您有用。 使用后只返回+--------------------+ | _c0| +--------------------+ |H201908127477474NO...| |T3 637373...| +--------------------+ 【参考方案1】:

没有简单的方法可以按行号删除行,因为 Spark DataFrame 默认没有顺序的概念1。没有“第一”或“最后”行——每一行都被视为一个独立的结构化数据块。这是 spark 的基础,也是允许它分布/并行计算的原因 - 每个执行程序都可以获取任意数据块和进程。

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

如果您提前知道正确的架构,您可以将其传递给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|
#+---+------+--------+-------+

注意事项:

    您可以通过sortWindow 函数引入订单。请参阅:Pyspark add sequential and deterministic index to dataframe(并查看问题中链接的帖子)。

    如果你真的想删除第一行和最后一行,你可以add line numbers to rdd with zipWithIndex(),并用它来过滤掉最小和最大的行号。

【讨论】:

以上是关于从pyspark中的文本文件中删除第一行和最后一行的主要内容,如果未能解决你的问题,请参考以下文章

如果第一行和最后一行不够长,如何在 Emacs 中删除一个矩形文本?

使用 sed 删除文本文件最后一行中的新行

如何从 IFS 下载文本文件的最后一行删除 CRLF

使用XSLT从文本文件中删除第一行

如何从 C# 中的文本文件中删除一行?

cmd去除csv首行