Spark将RDD拆分成块并连接

时间:2016-12-15 12:14:00

标签: scala apache-spark

我有一个相对简单的问题。

我有一个大型Spark RDD [String](包含JSON)。在我的用例中,我想将N个字符串组合(连接)到一个新的RDD [String]中,这样它的大小就是oldRDD.size / N.

伪示例:

 val oldRDD : RDD[String] = ['{"id": 1}', '{"id": 2}', '{"id": 3}', '{"id": 4}']

 val newRDD : RDD[String] = someTransformation(oldRDD, ",", 2)
 newRDD = ['{"id": 1},{"id": 2}','{"id": 3},{"id": 4}']

 val anotherRDD : RDD[String] = someTransformation(oldRDD, ",", 3)
 anotherRDD = ['{"id": 1},{"id": 2},{"id": 3}','{"id": 4}']

我已经找了一个类似的案例,但找不到任何东西。

谢谢!

1 个答案:

答案 0 :(得分:2)

在这里你必须使用zipWithIndex函数,然后计算组。

例如,index = 3和n(组数)= 2为您提供第二组。 3/2 = 1(整数除法),因此基于0的第二组

val n = 3;
val newRDD1 = oldRDD.zipWithIndex() // creates tuples (element, index)
    // map to tuple (group, content)
    .map(x => (x._2 / n, x._1))
    // merge
    .reduceByKey(_ + ", " + _)
    // remove key
    .map(x => x._2)

一个注意事项:" zipWithIndex"是内部秩序。在业务逻辑中没有任何意义,您必须检查订单是否正常。如果没有,请对RDD进行排序,然后使用zipWithIndex