在java中,如何链接原始RDD和转换后得到的RDD

时间:2016-05-07 18:38:04

标签: java apache-spark rdd

我有一个自定义对象的RDD,比方说Person。然后我在这个RDD上使用几个窄的(尽管可能很宽)转换,每次我得到一个新的RDD。最后我得到了一个不同类型的RDD,比方说Integer。 现在,我想以某种方式了解Integer链接到每个Person的内容,并按照以下方式打印出来:

person a -> 3
person b -> 1
person c -> 7

我试过了:     JavaPairRDD resultRDD = myRDD.mapToPair(rec - > new Tuple2(rec,new SomeFunction.call(rec)));

这段代码对我有用,因为我可以得到每个元组并打印出来。但是我不确定当有很多变换时它是否是一种很好的方法来实现它(是吗?)

想要使用另一个选项:transformedRDD.parent(number,evidence)并以这种方式获取原始RDD,然后一些如何识别Person和Integer之间的引用。

注意:evidencescala.reflect.ClassTag<U>,我不熟悉scala,所以我真的不明白在那里写什么

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

我只需要随身携带一把钥匙。这种方式更容易避免遗漏识别,因为每次物品都带有ID。换句话说:

persons
.map(p => (id, p))
.map( (id, p) => (id, transformation1(p)) )
.map( (id, p) => (id, transformation2(p)) )
....

答案 1 :(得分:0)

我认为这个问题没有正确或错误的答案。可能会有更好的答案。

你是在正确的轨道上首先考虑制作rdd到PairRDD。但是,正如您所说,对初始RDD结构进行了许多转换,它很快就会变得复杂。

Dependency graph 对不好的绘图很抱歉..无论如何可能是因为多依赖性,它还不是很清楚在PairRDD的关键字段放什么。 我不确定你是否就是这种情况,但我认为如果这种关系不是一对一的话,可能会有很多人产生一个整数。 如果在解释依赖关系信息之前对整数使用reduce操作,则需要担心Integer可能不只有一个祖先。

无论如何,我认为解决此问题的最佳方法是在RDD中添加唯一标识符ArrayList字段。而不是制作一个增加不必要结构的PairRDD,只需将此字段视为表示当前RDD字段的祖先的图形。

例如,Persons对象将有一个名为“dependency”的字段,它是长度为0的arraylist,因为它没有祖先。 在那之后,假设你因为某种原因转变为Double。然后,生成的RDD包含名为“dependency”的字段,其长度为1,表示Person对象的唯一标识符字段。 最后我们转换为Integer。我们再次使用一个RDD,其字段名为“dependency”,长度为2(因为我们有两个祖先用于这个整数),表示Person对象的唯一标识符和Double对象的唯一标识符。

我认为我的解释有点冗长而冗长,但我希望你能理解......

最后,如果你在RDD之间进行减少操作,你必须考虑你是否真的有一对一的案例。因为一个Integer可能不是来自一个Person对象,所以如果你想要发现这个Integer的完整血统,你必须将所有依赖信息添加到arraylist。此外,当你破译这个“依赖”arraylist时,你必须记住,如果关系不是一对一的,并且你在RDD之间使用reduce,那么列表的长度可以是任意的。

我认为最好的解决方案就是这个,但我认为这个问题可能会有更简单的答案。如果你发现一个让我知道!

答案 2 :(得分:0)

经过一些实验后,我决定使用以下解决方案:

JavaRDD<Person> persons = sc.parallelize(personList);
JavaRDD<Person,SomeType> trans1 = persons.mapToPair(p -> new Tuple2<Person,SomeType>(p, someFunction.call(p)));
JavaRDD<Person,OtherType> trans2 = trans1.mapToPair(tuple -> new Tuple2<Person,OtherType>(tuple._1(), otherFunction.call(tuple._2())));

你可以随心所欲地继续,并且你总是引用Person对象。它可以使用.mapToPair以更简洁的方式完成,而不会声明其他RDD,但对我而言,这样更清楚。