繁体   English   中英

合并循环中生成的多个RDD

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM