我有一个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)
答案 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)
}