不能使用不同数量的分区来压缩RDD。我可以用什么作为拉链的替代品?

时间:2016-11-03 15:48:27

标签: scala apache-spark rdd zipper

我有三个大小相同的RDD rdd1包含一个字符串标识符,rdd2包含一个向量,rdd3包含一个整数值。

基本上我想将这三个压缩在一起以获得RDD[String,Vector,Int]的RDD,但我不断得到不能用不同数量的分区压缩RDD。我怎样才能完全绕过拉链做上述事情?

3 个答案:

答案 0 :(得分:6)

尝试:

rdd1.zipWithIndex.map(_.swap).join(rdd2.zipWithIndex.map(_.swap)).values

答案 1 :(得分:1)

他们都有相同数量的元素吗? zipPartitions用于在特殊情况下加入RDD,它们完全相同数量的分区,完全每个分区中相同数量的元素。

你的案子没有这样的保证。在rdd3实际为空的情况下,您想要做什么?你应该得到一个没有元素的结果RDD吗?

编辑:如果您知道长度是完全相同的,LostInOverflow的答案将起作用。

答案 2 :(得分:1)

在拆分原始RDD之前,请为每一行指定一个唯一ID RDD.zipWithUniqueId。然后确保在从原始文件中吐出的每个RDD中包含id字段,并将它们用作这些行的键(如果id不是键,则使用keyBy)然后使用RDD.join重新排列。

示例可能如下所示:

val rddWithKey = origionalRdd.zipWithUniqueID().map(_.swap)
val rdd1 = rddWithKey.map{case (key,value) => key -> value.stringField }
val rdd2 = rddWithKey.map{case (key,value) => key -> value.intField }

/*transformations on rdd1 and 2*/

val重组= rdd1.join(rdd2)