Scala 如何合并两个不同大小的RDD

Scala 如何合并两个不同大小的RDD,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,现在我有两个RDD(阵列),如下所示: 1,2 3,4 第二个是这样的 5,6,7 8,9,10 现在我使用rdd1.union(rdd2),结果如下: 1,2 3,4 5,6,7 8,9,10 但我想要的结果是: 1,2,0 3,4,0 5,6,7 8,9,10 我只是想得到一个数组,它的行具有相同数量的元素,并且新元素被设置为0 我想知道如何解决这个问题?你几乎做了你想做的!一般的解决方案是:只需将第一个Rdd映射到与第二个Rdd相同的结构。我建议使用元组和类型别名使代码更清晰。比如说: i

现在我有两个RDD(阵列),如下所示:

1,2

3,4

第二个是这样的

5,6,7

8,9,10

现在我使用rdd1.union(rdd2),结果如下:

1,2

3,4

5,6,7

8,9,10

但我想要的结果是:

1,2,0

3,4,0

5,6,7

8,9,10

我只是想得到一个数组,它的行具有相同数量的元素,并且新元素被设置为0


我想知道如何解决这个问题?

你几乎做了你想做的!一般的解决方案是:只需将第一个Rdd映射到与第二个Rdd相同的结构。我建议使用元组和类型别名使代码更清晰。比如说:

import org.apache.spark.rdd.RDD
type X = Double
type Y = Double
type Z = Double
val rdd1: RDD[(X, Y)] = sc.parallelize(List((1,2), (3,4)))
val rdd2: RDD[(X,Y,Z)] = sc.parallelize(List((5,6,7), (8,9,10)))
val result: RDD[(X,Y,Z)] = rdd1
  .map { 
    case(x,y) => (x, y, 0.0)
  }
  .union(rdd2)

但是如果您不确定长度,那么使用数组,将它们映射到其他带有零的数组中,然后使用并集。

映射到第一个RDD上,并添加额外的0元素。然后将其与第二个RDD结合起来?我投票赞成这个答案,因为我完全同意您将第一个RDD结构映射到第二个RDD结构中,但是类型别名不是必需的。您完全正确,这不是必需的。但我认为在使用Rdd的环境中提到这个技巧并没有坏处。如果你有很多RDD[(Int,Int,Int)],很快就会变得非常不清楚RDD[(Int,Int,Int)]是什么意思。另一种方法是使用数据帧。