使用scala在spark中创建成对RDD

使用scala在spark中创建成对RDD,scala,apache-spark,hadoop,Scala,Apache Spark,Hadoop,我是spark的新手,所以我需要创建一个只有两个元素的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)

我是spark的新手,所以我需要创建一个只有两个元素的
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)


谢谢

您可以获得如下所需的结果:

//在执行'groupBy'之前,您有一个RDD[(Int,Int)],x,包含:
//   (1,1),(1,2),(1,3),(2,1),(2,2),(2,3)
//
//可以简单地如下映射值。结果是RDD[(Int,(Int,Int))]。
valx: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))//将成对元组中的第一个值映射到元组
y、 collect//Get结果作为数组
//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-组合,如下所示:

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)))

除非我误解了需求,从预期的输出
(1,(1,2)),(1,(1,3)),(1(2,3),(2,(1,2)),(2,(2,3)),(2,(2,3))
,我不认为将
(k,v)
扩展到
(k,(k,v))
是OP想要的。@LeoC的好观点。我错过了!但(对我来说)不清楚正是他想要的…仔细看了答案后,我看不到输入和输出之间的关系,除非他想要每一个键的每一对值的每一个排列…如果给定键只有一个值会发生什么?我也不完全清楚。如果按键的值的2个组合确实是什么OP Wands,一个只有一个值的键可能会被完全丢弃,或者被转换为,比如,(k,null)。你能更详细地解释一下你的数据结构,以明确预期的数据应该是什么样子吗?谢谢!例如,如果输入数据是
(a,x),(a,y),(a,z),(b,x),(b,y),(b,z),(c,x)
预期的输出是什么?输入如何映射到输出?