比较RDD中的行

时间:2015-04-15 14:41:24

标签: scala for-loop apache-spark rdd

如何迭代RDD行并将一行与RDD中的下一行进行比较?

我知道我可以通过以下方式使用for循环:for(x< -rddItems),有没有办法在for循环中执行类似x.next()的操作?或者在里面使用一些索引?

感谢

4 个答案:

答案 0 :(得分:1)

您可以使用mapPartitions执行此类操作:

rdd.mapPartitions { partition =>
  var previous = partition.next
  for (element <- partition) yield {
    val result = previous == element // Do your comparison.
    previous = element
    result
  }
}

但这并不是将分区N的最后一个元素与分区N + 1的第一个元素进行比较。这样做会很复杂并且会损害性能。所以我只是交叉双手,希望你能错过一些比较!

答案 1 :(得分:0)

您可以使用mapPartitions迭代RDD的每个单独分区,例如:

val rdd = sc.parallelize(List(1,73,5,226))
rdd.mapPartitions { iter =>

  var last = 0
  var result = List[Boolean]()
  while (iter.hasNext) {
    val current = iter.next
    result = result ::: List(current > last)
    last = current
  }

  result.iterator
}.collect().foreach(println)

给出:

  

真   真正   假   真

这是在逐个分区的基础上完成的,而不是通过整个RDD完成的。

答案 2 :(得分:0)

您需要创建一个键,然后将rdd加入到自身(应用您的偏移量)。

答案 3 :(得分:-1)

我已经想到了这种可能性,我不确定它真的很好吗?

def diff_timestamp(liste):
    timestamps = liste
    r          = []
    values     = []
    for indice, valeur in enumerate(timestamps):
        values.append(float(valeur))
        if indice>0:
            delta = values[indice] - values[indice-1]
            r.append(delta)
    return r