我是新来的火花。我的问题是以下。我已经有一个与数据配对的RDD。现在,我需要对其应用映射转换,以便获得具有新值的新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)
});
如果我采用这种方式编码,执行程序是否会创建新作业(用于过滤器和交叉点)并自行启动?还是火花上下文会意识到这一点,并将为此创造新的就业机会???我一直在阅读官方文档,但他们并不清楚在这种情况下会发生什么。 预先感谢!
答案 0 :(得分:0)
实际上,唯一可以执行任务的人是称为上下文的主人。这意味着您不能做这样的事情来声明另一个RDD,甚至不能相互使用它。
此外,您期望的是联接操作。就像关系数据库的联接操作一样。换句话说,有两个表,并且在这两个表之间有一个公共列,您可以基于该列找到相似的元组。为此,您需要有两个RDD,它们各自的所有对象都有一个密钥。
join(otherDataset,[numPartitions])在类型为(K,V)和(K,W)的数据集上调用时,返回(K,(V,W))对的数据集,每对都有所有元素对键。通过leftOuterJoin,rightOuterJoin和fullOuterJoin支持外部联接。
有关更多信息,您也可以使用此Join two ordinary RDDs with/without Spark SQL