spark - 如何在另一个RDD转换中查找(Java)PairRDD的键和值

时间:2017-03-09 16:03:56

标签: java scala apache-spark rdd

我有一个具有Integer键和Integer []值的PairRDD insert into table_name select * from external_table_name;

我还有另一个具有整数键和双值的PairRDD rdd1

密钥中的每个整数和rdd2的值也作为密钥存在于rdd1中。

我希望rdd2中的每一对(x, [y1,y2,...,yn])获取rdd1的双精度值以及每个整数xy1的所有双精度值,...,y2

我尝试将yn收集为rdd2Map<Integer,Double>),但它不适合内存,我收到OOM错误。我也试过加入rdds,但我无法弄清楚如何加入键和值。不允许在map2内使用rdd2 lookup()方法。

我想要的伪代码如下:

rdd1

map each (int x, int[] y) in rdd1 to: (x, map2.get(x) + sum(map2.get(yi))) 中的每个yi

我使用Java,但我猜Java和Scala都存在同样的问题。

2 个答案:

答案 0 :(得分:1)

根据您对丢失匹配的要求(rdd1中有索引而rdd2中没有相应索引的情况),查询类似于以下内容。

rdd1.
    // ( x, [ y1, ..., yn ] ) -> ( x, x ), ( y1, x ), ..., ( yn, x )
    flatMap { case ( x, ys ) => ( x :: ys ).map( ( _, x ) ) }.
    // ( xory, x ) -> ( xory, ( x, rdd2.lookup( xory ) ) )
    leftOuterJoin( rdd2 ).
    // ( xory, ( x, rdd2.lookup( xory ) ) ) -> ( x, rdd2.lookup( xory ) )
    map( _._2 ).
    // ( x, rdd2.lookup( x ) ), ... -> ( x, rdd2.lookup( x ) + sum_i( rdd2.lookup( y_i ) )
    reduceByKey{ case ( dopt1, dopt2 ) => ( dopt1 ++ dopt2 ).reduceOption( _ + _ ) }.
    // unwrap the option types
    mapValues( _.getOrElse( 0.0 ) )

答案 1 :(得分:-1)

HashMap<Integer, List<Integer>> map = new HashMap<>();
    map.put(1,asList(2,3));
    map.put(3,asList(4,5));

    System.out.println(
            map.entrySet().stream()
                    .flatMap(kv -> 
                            Stream.concat(
                                    Stream.of((double)kv.getKey()),
                                    kv.getValue().stream().mapToDouble( x -> Double.valueOf((double)x) ).boxed())
                    )
                    .collect(Collectors.toList())
            );

这个怎么样? ...应该在一个RDD中提供所有(键和值),您可以将其用作第二个RDD中的键。您当然可以更改类型。