我有三个大小相同的RDD rdd1
包含一个字符串标识符,rdd2
包含一个向量,rdd3
包含一个整数值。
基本上我想将这三个压缩在一起以获得RDD[String,Vector,Int]
的RDD,但我不断得到不能用不同数量的分区压缩RDD。我怎样才能完全绕过拉链做上述事情?
答案 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)