合并循环中生成的多个RDD

时间:2016-03-15 01:08:10

标签: scala apache-spark rdd

我在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在您想要合并字符串时在Java中为您做的事情。我已经研究了合并RDD的技术,这些技术主要指向使用像这样的联合函数

RDD1.union(RDD2)

但是这需要在结合之前生成两个RDD。我虽然初始化一个var RDD1来累积for循环之外的结果,但我不知道如何初始化[(Long,Long,Double)]类型的空白RDD。另外我开始使用spark,所以我甚至不确定这是否是解决此问题的最优雅的方法。

2 个答案:

答案 0 :(得分:4)

您可以使用函数式编程范例来实现您想要的目标,而不是使用变量:

val rdd = (1 to n).map(x => helperFunction()).reduce(_ union _)

此外,如果您仍需要创建一个空的RDD,可以使用以下方法执行:

val empty = sc.emptyRDD[(long, long, String)]

答案 1 :(得分:2)

您认为这可能不是执行此操作的最佳方式,但我们需要有关您在每次调用辅助函数时生成新RDD所要完成的内容的更多信息。

您可以在循环之前定义1个RDD并为其分配var然后通过循环运行它。这是一个例子:

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    UIViewController *presentingViewController = picker.presentingViewController;
    ImagePreviewController *ipc = [self.storyboard instantiateViewControllerWithIdentifier:@"ImagePreviewController"];
    UIImage * image = [info valueForKey:UIImagePickerControllerOriginalImage];

    ipc.selectedImage = image;

    [presentingViewController dismissViewControllerAnimated:YES completion:^(BOOL animated){
        [presentingViewController presentViewController:ipc animated:YES completion:nil];
    }];
 }