[英]creating pair RDD in spark using scala
我是新手,所以我只需要创建两个元素的RDD
。
Array1 = ((1,1)(1,2)(1,3),(2,1),(2,2),(2,3)
当我执行groupby键时,输出为((1,(1,2,3)),(2,(1,2,3))
但是我需要输出与键只有2个值对。 我不确定如何获得它。
Expected Output = ((1,(1,2)),(1,(1,3)),(1(2,3),(2(1,2)),(2,(1,3)),(2,(2,3)))
这些值只能打印一次。 应该只有(1,2)
而不是(2,1)
或类似(2,3)
而不是(3,4)
谢谢
您可以按以下方式获得所需的结果:
// Prior to doing the `groupBy`, you have an RDD[(Int, Int)], x, containing:
// (1,1),(1,2),(1,3),(2,1),(2,2),(2,3)
//
// Can simply map values as below. Result is a RDD[(Int, (Int, Int))].
val x: RDD[(Int, Int)] = sc.parallelize(Seq((1,1),(1,2),(1,3),(2,1),(2,2),(2,3))
val y: RDD[(Int, (Int, Int))] = x.map(t => (t._1, t)) // Map first value in pair tuple to the tuple
y.collect // Get result as an array
// res0: Array[(Int, (Int, Int))] = Array((1,(1,1)), (1,(1,2)), (1,(1,3)), (2,(2,1)), (2,(2,2)), (2,(2,3)))
也就是说,结果是将键(每个对的第一个值)与该对(作为元组 )相关联的对RDD
。 不要使用groupBy
,因为在这种情况下,它将无法满足您的需求。
如果我正确理解了您的要求,则可以使用groupByKey
和flatMapValues
展平分组值的2-combinations
,如下所示:
val rdd = sc.parallelize(Seq(
(1, 1), (1, 2), (1 ,3), (2, 1), (2, 2), (2, 3)
))
rdd.groupByKey.flatMapValues(_.toList.combinations(2)).
map{ case (k, v) => (k, (v(0), v(1))) }.
collect
// res1: Array[(Int, (Int, Int))] =
// Array((1,(1,2)), (1,(1,3)), (1,(2,3)), (2,(1,2)), (2,(1,3)), (2,(2,3)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.