从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|
#+---+------+--------+-------+
注意事项:
您可以通过sort
或Window
函数引入订单。请参阅:Pyspark add sequential and deterministic index to dataframe(并查看问题中链接的帖子)。
如果你真的想删除第一行和最后一行,你可以add line numbers to rdd with zipWithIndex()
,并用它来过滤掉最小和最大的行号。
【讨论】:
以上是关于从pyspark中的文本文件中删除第一行和最后一行的主要内容,如果未能解决你的问题,请参考以下文章