我有一个具有Integer键和Integer []值的PairRDD insert into table_name select * from external_table_name;
。
我还有另一个具有整数键和双值的PairRDD rdd1
。
密钥中的每个整数和rdd2
的值也作为密钥存在于rdd1
中。
我希望rdd2
中的每一对(x, [y1,y2,...,yn])
获取rdd1
的双精度值以及每个整数x
,y1
的所有双精度值,...,y2
。
我尝试将yn
收集为rdd2
(Map<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都存在同样的问题。
答案 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中的键。您当然可以更改类型。