我希望消除Foo
的歧義。他們中的一些需要分解成單獨的實例。每個需要一個獨特的,連續的Id。展開RDD並將連續ID分配給新元素
val maxId: Long = foos.map(_.id).max()
foos.flatMap { foo =>
if (foo.bar) List(foo, foo.copy(id = ???, ...))
else List(foo)
}
在普通的Scala中,我會使用foldLeft。使用Spark,我能想到的最好的是flatmap到(Foo, Option[Long])
,由_._2.isEmpty
過濾,zipWithIndex並加入。有更聰明的方法嗎?
例如鑑於
case class Foo(id: Long) {
val bar: Boolean = id % 2 == 1
}
此輸入
RDD(Foo(1), Foo(2), Foo(3))
應該成爲
RDD(Foo(1), Foo(2), Foo(3), Foo(4), Foo(5))
因爲Foo(1)
和Foo(3)
擴大,並就下一個可用的IDS(4 & 5)。
也許別人可以理解你的問題是什麼,但我無法弄清楚。一般來說,在常規Scala集合上習慣的所有典型操作(特別是monad操作)都可以用於RDD。 – Phasmid
啊,好的。我在問題中提出了一個簡潔的例子。 – Synesso
@Synesso是否收集元素的順序很重要? – Odomontois