如何迭代RDD行并将一行与RDD中的下一行进行比较?
我知道我可以通过以下方式使用for循环:for(x< -rddItems),有没有办法在for循环中执行类似x.next()的操作?或者在里面使用一些索引?
感谢
答案 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