PySpark Drop Rows

Jac*_*ack 21 python mapreduce apache-spark

你如何从PySpark的RDD中删除行?特别是第一行,因为它往往包含我的数据集中的列名.从细读API,我似乎找不到一个简单的方法来做到这一点.当然我可以通过Bash/HDFS来做到这一点,但我只是想知道这是否可以在PySpark中完成.

小智 21

特定于PySpark:

根据@maasg,您可以这样做:

header = rdd.first()
rdd.filter(lambda line: line != header)
Run Code Online (Sandbox Code Playgroud)

但它在技术上并不正确,因为你可以排除包含数据和标题的行.但是,这似乎对我有用:

def remove_header(itr_index, itr):
    return iter(list(itr)[1:]) if itr_index == 0 else itr
rdd.mapPartitionsWithIndex(remove_header)
Run Code Online (Sandbox Code Playgroud)

同理:

rdd.zipWithIndex().filter(lambda tup: tup[1] > 0).map(lambda tup: tup[0])
Run Code Online (Sandbox Code Playgroud)

我是Spark的新手,所以不能聪明地评论哪个会最快.


maa*_*asg 19

AFAIK没有'简单'的方法来做到这一点.

不过,这应该可以解决问题:

val header = data.first
val rows = data.filter(line => line != header)
Run Code Online (Sandbox Code Playgroud)


nol*_*eto 5

假设您使用的是Python 3,在PySpark(Python API)中实现此目的的直接方法:

noHeaderRDD = rawRDD.zipWithIndex().filter(lambda row_index: row_index[1] > 0).keys()
Run Code Online (Sandbox Code Playgroud)