【问题标题】:Pyspark RDD: find index of an elementPyspark RDD:查找元素的索引
【发布时间】:2017-01-28 06:42:06
【问题描述】:

我是 pyspark 的新手,我正在尝试将 python 中的列表转换为 rdd,然后我需要使用 rdd 查找元素索引。对于我正在做的第一部分:

list = [[1,2],[1,4]]
rdd = sc.parallelize(list).cache()

所以现在 rdd 实际上是我的列表。问题是我想找到任何任意元素的索引,比如适用于 python 列表的“索引”函数。我知道一个名为 zipWithIndex 的函数,它为每个元素分配索引,但我在 python 中找不到合适的例子(有 java 和 scala 的例子)。

谢谢。

【问题讨论】:

标签: python pyspark


【解决方案1】:

使用filterzipWithIndex

rdd.zipWithIndex().
filter(lambda (key,index) : key == [1,2]).
map(lambda (key,index) : index).collect()

请注意,此处的[1,2] 可以轻松更改为变量名,并且可以将整个表达式包装在一个函数中。

工作原理

zipWithIndex 只返回一个 (item,index) 元组,如下所示:

rdd.zipWithIndex().collect()
> [([1, 2], 0), ([1, 4], 1)]

filter 仅查找符合特定条件的那些(在本例中,key 等于特定子列表):

rdd.zipWithIndex().filter(lambda (key,index) : key == [1,2]).collect()
> [([1, 2], 0)]

map 相当明显,我们可以直接取回索引:

rdd.zipWithIndex().filter(lambda (key,index) : key == [1,2]).
map(lambda (key,index): index).collect()
> [0]

然后我们可以简单地通过索引[0] 来获取第一个元素。

【讨论】:

  • 问题是,当我将“rdd.zipWithIndex.collect()”添加到我的代码时,它会返回以下错误:“AttributeError: 'function' object has no attribute 'collect'”
  • 你——我的意思是我——忘记了()。应该是rdd.zipWithIndex().collect()
  • 另请注意,collect 将返回一个列表。如果你有一个真正庞大的数据集,我请求你不要做collect,而是在调用collect()之前先取样。
  • @nimafl 用更正的代码更新了答案。感谢您发现:)
  • 感谢您指出列表内容以及答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多