Python Pyspark RDD:查找元素的索引
我是pyspark的新手,我正在尝试将python中的列表转换为rdd,然后我需要使用rdd查找元素索引。对于第一部分,我正在做:Python Pyspark RDD:查找元素的索引,python,pyspark,Python,Pyspark,我是pyspark的新手,我正在尝试将python中的列表转换为rdd,然后我需要使用rdd查找元素索引。对于第一部分,我正在做: list = [[1,2],[1,4]] rdd = sc.parallelize(list).cache() 所以现在rdd实际上是我的列表。问题是我想找到任意元素的索引,比如“index”函数,它适用于python列表。我知道一个名为zipWithIndex的函数,它为每个元素分配索引,但我在python中找不到合适的示例(有java和scala的示例) 谢谢
list = [[1,2],[1,4]]
rdd = sc.parallelize(list).cache()
所以现在rdd实际上是我的列表。问题是我想找到任意元素的索引,比如“index”函数,它适用于python列表。我知道一个名为zipWithIndex的函数,它为每个元素分配索引,但我在python中找不到合适的示例(有java和scala的示例)
谢谢。使用
过滤器和zipWithIndex
:
rdd.zipWithIndex().
filter(lambda (key,index) : key == [1,2]).
map(lambda (key,index) : index).collect()
注意这里的[1,2]
可以很容易地更改为变量名,并且整个表达式可以包装在函数中
工作原理
zipWithIndex
只返回(item
,index
)的元组,如下所示:
filter
仅查找与特定条件匹配的项(在本例中,key
等于特定子列表):
地图
相当明显,我们只需返回索引即可:
rdd.zipWithIndex().filter(lambda (key,index) : key == [1,2]).
map(lambda (key,index): index).collect()
> [0]
然后,如果需要,我们可以通过索引[0]
简单地获得第一个元素。通过任意元素,您是指任意子列表,如[1,2]
?@AkshatMahajan是的,这就是我对记录的意思。问题是,当我向代码添加“rdd.zipWithIndex.collect()”时,它返回以下错误:“AttributeError:‘function’object没有属性‘collect’”。你——我的意思是我——忘记了一个()
。它应该是rdd.zipWithIndex().collect()
。还要注意collect将返回一个列表。如果你有一个真正庞大的数据集,我请求你不要做collect
,而是在调用collect()之前先取一个样本。)
@nimafl用更正后的代码更新了答案。感谢您捕捉到:)感谢您指出列表内容以及答案:)
rdd.zipWithIndex().filter(lambda (key,index) : key == [1,2]).collect()
> [([1, 2], 0)]
rdd.zipWithIndex().filter(lambda (key,index) : key == [1,2]).
map(lambda (key,index): index).collect()
> [0]