我有一个RDD(Long,util.List [Foo]),我想在列表上展平,看起来像RDD(Long,Foo),然后最终调用一个getCode方法,它是Foo的一部分。到目前为止,这是我的方法
val test = source
.filter(x => x.getFooList != null)
.map(x => (x.getFooList, x.getId))
.map{
case(foo, id) => foo.toArray().map(foo => (foo, id))
}
理想情况下,我想将id放在第一个位置
此方法有效。但是toArray方法将它从Foo转换为AnyRef。我不能在AnyRef上调用getCode方法。这样做的最佳方式是什么?
答案 0 :(得分:2)
首先 - 如果您想要展平您的RDD,您必须使用flatMap
而不是map
。其次,如果你想要" id"首先 - 将它放在你为每个项目构建的元组中的第一位。第三 - 由于您的源RDD包含java.util.List
,因此您必须将它们(可以使用正确的导入隐式完成)转换为Scala集合:
import scala.collection.JavaConversions._ // import to get implicit conversion
val test: RDD[(Long, Foo)] = source
.filter(x => x.getFooList != null)
.map(x => (x.getFooList, x.getId))
.flatMap { // use flatMap
case (foo, id) => foo.map(f => (id, f)) // switch the order
}
答案 1 :(得分:1)
将util.List
转换为 scala List
可以解决此问题:
import scala.collection.JavaConverters._
...
case(foo, id) => foo.asScala.map(foo => (foo, id))
...