修改zipWithIndex

时间:2016-06-27 13:11:31

标签: scala indexing apache-spark rdd

我有一个RDD,其中包含以下值:

v
v v
v
v
v v
v

我想索引上面的RDD。我想索引它的方式是,如果一行有两个值,下一行的索引应该增加1,所以索引的RDD看起来像:

v, 0
v v, 1
v, 3
v, 4
v v, 5
v, 7

这样甚至可以使用spark吗?如果是,我该如何做到这一点?

更新1

此外,如果有人可以展示如何扩展zipWithIndex函数并创建一个新函数,根据ex的输入字符串递增每行的索引,那将会很棒。 (data, index+data.length)

1 个答案:

答案 0 :(得分:1)

这是一个可能很慢但相对简单的解决方案:想法是用一些ID标记这些记录,拆分它们,以便每个值都是一个单独的记录(然后可以使用{轻松枚举) {1}}),然后使用我们创建的ID分组回原始结构:

zipWithIndex

结果将是:

// sample data:
val input = sc.parallelize(Seq(
  List("a"),
  List("b", "c"),
  List("d"),
  List("e", "f")
))

val result: RDD[(List[String], Long)] = input
  .zipWithIndex() // add key to each record, so we can construct them back later
  .flatMap { case (list, id) => list.map(i => (id, i)) } // "split" into individual records
  .sortByKey().zipWithIndex() // enumerate individual values
  .groupBy { case ((key, value), index) => key } // grouping by key
  .values.map { iter =>   // mapping back to the structure we want
     val list = iter.toList
     val index: Long = list.map(_._2).min
     val values: List[String] = list.map(_._1._2)
     (values, index)
   }