如何在spark rdd中展平列表?

时间:2017-01-09 08:18:13

标签: scala apache-spark

我有一个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方法。这样做的最佳方式是什么?

2 个答案:

答案 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))
...