[英]Merge multiple RDD generated in loop
我在scala中调用一个函数,它给出了一个RDD[(Long,Long,Double)]
作为输出。
def helperfunction(): RDD[(Long, Long, Double)]
我在代码的另一部分循环调用此函数,我想合并所有生成的RDD。 调用该函数的循环看起来像这样
for (i <- 1 to n){
val tOp = helperfunction()
// merge the generated tOp
}
我想要做的是类似于StringBuilder在你想要合并字符串时为你做的事情。 我已经研究了合并RDD的技术,这些技术主要指向使用这样的union函数
RDD1.union(RDD2)
但是这需要在结合之前生成两个RDD。 我虽然初始化一个var RDD1来累积for循环之外的结果,但我不知道如何初始化[(Long,Long,Double)]
类型的空白RDD。 另外我开始使用spark,所以我甚至不确定这是否是解决此问题的最优雅的方法。
您可以使用函数式编程范例来实现您想要的,而不是使用变量:
val rdd = (1 to n).map(x => helperFunction()).reduce(_ union _)
此外,如果您仍需要创建一个空的RDD,您可以使用以下命令:
val empty = sc.emptyRDD[(long, long, String)]
你是对的,这可能不是最好的方法,但是我们需要更多关于你想要通过每次调用辅助函数生成一个新RDD的信息。
您可以在循环之前定义1个RDD并为其分配var然后在循环中运行它。 这是一个例子:
val rdd = sc.parallelize(1 to 100)
val rdd_tuple = rdd.map(x => (x.toLong, (x*10).toLong, x.toDouble))
var new_rdd = rdd_tuple
println("Initial RDD count: " + new_rdd.count())
for (i <- 2 to 4) {
new_rdd = new_rdd.union(rdd_tuple)
}
println("New count after loop: " + new_rdd.count())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.