【问题标题】:Creating auxiliar RDDs inside map function [duplicate]在 map 函数中创建辅助 RDD [重复]
【发布时间】:2019-02-24 00:05:25
【问题描述】:

我是新来的火花。我的问题如下。我已经有一个带有数据的 pairRDD。现在,我需要对其应用映射转换,以便我返回一个具有新值的新 RDD,该值取决于映射函数内部的一些内部转换,如下所示。 (伪代码)

JavaPairRDD<Long,Long> originalRDD = .... //the one i load from the dataset
JavaPairRDD<Long,Long> anotherrdd = ......; //the source of tuples
JavaPairRDD<Tuple2<Long, Long>, Long> result = anotherrdd
                .mapToPair(tuple-> {
                    JavaRDD<Long> aux1;
                    JavaRDD<Long> aux2;
                    aux1 = originalRDD.filter(T -> T._1.equals(tuple._1)).values().flatMap(f -> f);
                    aux2 = originalRDD.filter(T -> T._2.equals(tuple._2)).values().flatMap(f -> f);
                    JavaPairRDD<Long,Long> auxfinal = aux1.intersect(aux2);
                    //some other code here that process auxfinal and returns a 
                    //new tuple to RESULT(rdd)
                }); 

如果我以这种方式编码,执行程序是否会创建新作业(用于过滤器和交叉点)并自行启动它们?还是火花上下文会意识到这一点并为此创造新的工作?我一直在阅读官方文档,但他们没有说明在这种情况下会发生什么。 提前致谢!

【问题讨论】:

    标签: java apache-spark


    【解决方案1】:

    其实,唯一能做任务的就是master,也就是所谓的context。这意味着你不能做这样的事情来声明另一个 RDD 甚至在另一个 RDD 中使用它。

    此外,您所期望的是连接操作。就像关系数据库的join操作一样。换句话说,有两个表,并且这两个表之间有一个公共列,您可以根据该列找到相似的元组。为此,您需要有两个 RDD,它们都具有所有对象的键。

    join(otherDataset, [numPartitions]) 当在 (K, V) 和 (K, W) 类型的数据集上调用时,返回 (K, (V, W)) 对的数据集,每个数据集的所有元素对钥匙。通过 leftOuterJoin、rightOuterJoin 和 fullOuterJoin 支持外连接。

    更多信息你也可以使用Join two ordinary RDDs with/without Spark SQL

    【讨论】:

    • 问题是,我需要“anotherRDD”中的每个元组来评估(K,V)按给定标准单独过滤,然后将数据相交然后将具有“公共”数据量的值映射到新的 RDD 上。 Join 转换对我的问题没有帮助。
    • 将问题视为嵌套的 FOR 循环(就像我们在普通 java 程序中所做的那样)。 “对于这个RDD的每个元组,获取密钥,从originalRDD(使用K)过滤所有数据并将这些元组带到aux1。然后从originalRDD(使用V)过滤所有数据并将这些元组带到aux2。获取两个辅助的交集。并将观察到的 K,V 返回到结果中,并带有一些计数。”
    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 2016-01-20
    • 2015-04-02
    • 2015-12-01
    • 1970-01-01
    相关资源
    最近更新 更多