我正在尝试使用完全外部连接连接两个JavaPairRDD。我想合并过滤器(如sql中的where子句),并且只选择一个rdd(根据某些条件选择左侧rdd或右侧rdd)。我尝试对连接的结果 rdd 执行过滤功能,但它似乎不支持像函数那样只选择一个 rdd 的转换。使用mapToPair,它不允许我过滤。我应该尝试做一个过滤器,然后映射(反之亦然),对数据进行两次传递。我会想到直接的完整外部连接函数支持来公开过滤器和映射在一起。
JavaPairRDD<String, Tuple2<Optional<MyData>, Optional<MyDate>>> bagrp = agrp.fullOuterJoin(agrp);
JavaPairRDD<String, MyData> outmap = fgrp.mapToPair(new PairFunction <Tuple2<String, Tuple2<Optional<MyData>, Optional<MyData>>>, String, MyData>()
{
@Override
public Tuple2<String, MyData> call(Tuple2<String, Tuple2<Optional<MyData>, Optional<MyData>>> arg0) throws Exception
{
if ( based on some condition ) return new Tuple2<String, MyData>(obj1,obj2);
else return null;
}
}
在mapToPair中返回null仍然存在于返回的RDD中。有没有办法避免,而不做显式过滤器?
谢谢斯里瓦桑
您可以改用 flatMapToPair
并在不希望包含任何内容时返回一个空迭代器,并在想要生成元素时返回一个包含单个元素的迭代器。
根据经验,最好更早地进行投影和筛选,以便减少集群周围的数据。我建议遵循它并首先过滤,然后进行连接。不会对数据进行两次传递,它会就地过滤。
更具体的答案取决于您的使用案例的详细信息。如果您的RDD已经使用相同的分区程序(重新分区方法)进行了分区,则可以进行连接,然后进行过滤,因为两个RDD的相同键已经位于相同的节点上。
之后,您执行mapToPair。从这个问题中不清楚您是否更改了对的密钥。如果不这样做,那么最好使用 mapValues 方法,因为它保留了分区,这可能对下一步有用。