在java中,如何在原始RDD和转换后得到的RDD之间link

In java, How to link between original RDD and the RDD I get after transformations

我有一个自定义对象的 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 不熟悉所以我不太明白在那里写什么

任何帮助将不胜感激!

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

首先考虑将 rdd 转换为 PairRDD 的做法是正确的。但是正如您所说,初始 RDD 结构有很多转换,它很快就会变得复杂。

抱歉画得不好.. 无论如何可能是为了多重依赖,在 PairRDD 的关键字段上放什么不是很清楚。 我不确定你是否属于这种情况,但我认为如果这种关系不是一对一的,那么可能会有很多人产生一个整数。 如果在解释依赖信息之前对 Integer 进行 reduce 操作,则需要担心 Integer 可能不是只有一个祖先。

不管怎样,我认为解决这个问题最好的办法就是在RDD中添加一个唯一标识的ArrayList字段。与其制作添加不必要结构的 PairRDD,不如将此字段视为表示当前 RDD 字段的祖先的图形。

例如,Persons 对象将有一个名为 "dependency" 的字段,该字段的长度为 0 arraylist,因为它没有祖先。 在那之后,假设您出于某种原因转换为 Double。然后生成的 RDD 包含一个名为 "dependency" 的字段,其长度为 1,表示 Person 对象的唯一标识符字段。 最后我们要转换为整数。同样,我们有一个 RDD,其字段名为 "dependency",长度为 2(因为对于这个整数我们有两个祖先),表示 Person 对象的唯一标识符和 Double 对象的唯一标识符。

我觉得我的解释有点冗长冗长,但我希望你明白意思..

最后如果你在RDD之间做reduce操作,你必须考虑你是否真的有一对一的情况。因为一个 Integer 可能不是来自一个 Person 对象,如果你想发现这个 Integer 的完整谱系,你必须将所有依赖信息添加到数组列表中。此外,当你解读这个 "dependency" arraylist 时,你必须记住,如果关系不是一对一的并且你在 RDD 之间使用 reduce,则列表的长度可以是任意的。

我认为最好的解决方案是这个,但我认为这个问题可能有更简单的答案。如果你找到一个告诉我!

我会一直随身携带一把钥匙 way.this 这样更容易避免错误识别,因为每个对象每次都带有它的 ID。换句话说:

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

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

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,但对我来说,这样更清楚。