Apache 火花完整的外部过滤器并选择可选字段



我正在尝试使用完全外部连接连接两个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 方法,因为它保留了分区,这可能对下一步有用。

相关内容

  • 没有找到相关文章

最新更新