Scala - 如何在RDD上迭代元组?

时间:2017-04-10 20:16:36

标签: scala apache-spark

我有一个包含这样的元组的RDD

  

(A,List(2,5,6,7))

     

(B,List(2,8,9,10))

我希望获得第一个元素的索引,其中值和索引之间的特定条件成立。 到目前为止,我已经在单个元组测试中尝试了这个并且它工作正常:

test._2.zipWithIndex.indexWhere { case (v, i) => SOME_CONDITION}

我无法找到如何迭代列表中的所有元组..我试过了:

val result= test._._2.zipWithIndex.indexWhere { case (v, i) => SOME_CONDITION}

1 个答案:

答案 0 :(得分:4)

首先,"迭代"这里是错误的概念 - 它来自命令式编程领域,您实际上自己迭代数据结构。 Spark使用一个功能范例,让你传递一个函数来处理RDD中的每个记录(使用一些高阶函数,如mapforeach ...)。

在这种情况下,您希望每个元素映射到新元素中。

要仅映射元组的右侧(不更改左侧),您可以使用mapValues

// mapValues will map the "values" (of type List[Int]) to new values (of type Int)
rdd.mapValues(list => list.zipWithIndex.indexWhere { 
  case (v, i) => someCondition(v, i) 
})

或者,使用普通map

rdd.map { 
  case (key, list) => (key, list.zipWithIndex.indexWhere { 
    case (v, i) => someCondition(v, i) 
  }) 
}