我有一个带有3个字段的rdd,如下所述。
1,2,6
2,4,6
1,4,9
3,4,7
2,3,8
现在,从上面的rdd,我想得到以下rdd。
2,4,6
3,4,7
2,3,8
结果rdd没有以1开头的行,因为1在输入rdd的第二个字段中没有。
答案 0 :(得分:3)
好的,如果我理解你想做什么,有两种方法:
将RDD
拆分为两个,其中第一个RDD包含“第二个字段”的唯一值,第二个RDD具有“第一个值”作为键。然后加入rdds。这种方法的缺点是distinct
和join
操作缓慢。
val r: RDD[(String, String, Int)] = sc.parallelize(Seq(
("1", "2", 6),
("2", "4", 6),
("1", "4", 9),
("3", "4", 7),
("2", "3", 8)
))
val uniqueValues: RDD[(String, Unit)] = r.map(x => x._2 -> ()).distinct
val r1: RDD[(String, (String, String, Int))] = r.map(x => x._1 -> x)
val result: RDD[(String, String, Int)] = r1.join(uniqueValues).map {case (_, (x, _)) => x}
result.collect.foreach(println)
如果您的RDD相对较小并且Set
个第二个值可以完全适合所有节点的内存,那么您可以创建该内存集作为第一步,将其广播到所有节点然后只过滤你的RDD:
val r: RDD[(String, String, Int)] = sc.parallelize(Seq(
("1", "2", 6),
("2", "4", 6),
("1", "4", 9),
("3", "4", 7),
("2", "3", 8)
))
val uniqueValues = sc.broadcast(r.map(x => x._2).distinct.collect.toSet)
val result: RDD[(String, String, Int)] = r.filter(x => uniqueValues.value.contains(x._1))
result.collect.foreach(println)
两个示例输出:
(2,4,6)
(2,3,8)
(3,4,7)