如何在Spark RDD(Java)中通过索引获取元素

pro*_*bie 27 java apache-spark rdd

我知道方法rdd.first(),它给了我RDD中的第一个元素.

还有方法rdd.take(num)这给了我第一个"num"元素.

但是没有可能通过索引获得元素吗?

谢谢.

maa*_*asg 57

这应该可以通过首先索引RDD来实现.转换zipWithIndex提供了稳定的索引,按原始顺序对每个元素进行编号.

鉴于: rdd = (a,b,c)

val withIndex = rdd.zipWithIndex // ((a,0),(b,1),(c,2))
Run Code Online (Sandbox Code Playgroud)

要按索引查找元素,此表单无用.首先,我们需要使用索引作为关键:

val indexKey = withIndex.map{case (k,v) => (v,k)}  //((0,a),(1,b),(2,c))
Run Code Online (Sandbox Code Playgroud)

现在,可以使用lookupPairRDD中的操作按键查找元素:

val b = indexKey.lookup(1) // Array(b)
Run Code Online (Sandbox Code Playgroud)

如果您希望lookup经常在同一个RDD上使用,我建议缓存indexKeyRDD以提高性能.

如何使用Java API执行此操作是为读者留下的练习.

  • 还要记住RDD的排序是未定义的,除非它已经排序.它可以在每次评估时改变.你也可以`map(_.swap)`来切换键和值. (13认同)
  • 你留下的"作为读者的练习"是这个问题的主要复杂性. (2认同)