使用scala在spark中创建成对RDD
我是spark的新手,所以我需要创建一个只有两个元素的使用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)
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)
预期的输出是什么?输入如何映射到输出?