我有一个相对简单的问题。
我有一个大型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}']
我已经找了一个类似的案例,但找不到任何东西。
谢谢!
答案 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