旧语境
我在我的数据集上做一个计算,要求每个元素都与自身相结合,即通过执行 mapToPair
在 JavaPairRDD<Tuple2<String, List<Double>>, Tuple2<String, List<Double>>>
类型。此组合使用 cartesian
依据:
JavaPairRDD<String, List<Double>> keyvals;
...
JavaPairRDD<Tuple2<String, List<Double>>, Tuple2<String, List<Double>>> combined = keyvals.cartesian(keyvals).filter(tpl -> !tpl._1._1.equals(tpl._2._1));
combined.mapToPair(tpl -> {
Tuple2<String, String> ids = new Tuple2<>(tpl._1._1, tpl._2._1);
double result = calculateResult(tpl._1._2, tpl._2._2);
return new Tuple2<>(ids, result);
}).filter(tpl -> tpl._2 > threshold).saveAsTextFile("result");
新上下文
我现在扩展了这个方法 calculateResult
接受三个 List<Double>
类型(而不是上面示例中的两个)。这要求数据集与自身结合两次。不过,在这里, cartesian
似乎不够。
因此,我的问题是:如何组合我的数据( keyvals
)两次,基本上产生了匹配的东西 JavaPairRDD<Tuple2<...>, Tuple2<...>, Tuple2<...>>
(伪代码)。
我的目标是调用这个方法 calculateResult(List<Double> s1, List<Double> s2 ,List<Double> s3)
在每个交叉组合对上。我想我可能没有采取正确的方法,试图用笛卡尔展开我上面给出的例子,但我不知道什么是正确的步骤。
不幸的是,我只能使用SparkJava2.4.x。
1条答案
按热度按时间laawzig21#
希望对你有帮助
我已经添加了代码内联注解来描述我正在尝试做的事情
List
而不是Tuple3
如果你需要更多的表演catesian joins
```JavaPairRDD<List, List<List>> result =
keyvals.cartesian(keyvals)
.filter(tpl -> !tpl._1._1.equals(tpl._2._1))
//Perform 3rd cartesian
.cartesian(keyvals)
//Skip the common ids from 1st and 3rd keyvals
.filter(tpl -> !tpl._1._1._1.equals(tpl._2._1))
//Map the result top Pair of Ids:List and Values:List<List>
.mapToPair((PairFunction<Tuple2<Tuple2<Tuple2<String, List>, Tuple2<String, List>>, Tuple2<String, List>>, List, List<List>>) tuple2Tuple2Tuple2 -> {