Spark:RDD.map/mapToPair 如何与 Java 一起工作

Spark: How RDD.map/mapToPair work with Java

我在文本文件中有一些 cw(整数 i,字符串字)对 i word 的出现次数。

我只想为每一对添加一个新的对 c1 (Integer i, 1) 和 1 个固定数字。

这看起来真的很琐碎,但我还没有理解 map/mapToPair 函数是如何工作的。

JavaPairRDD<Integer, Integer> c1 = cw.map(??? -> new Tuple2<Integer, Integer>(??, 1));

我正在使用 Java-8。

如果我没理解错的话,你有下面的 JavaPairRDD。

JavaPairRDD<Integer, String> cw = ...;

现在你想在第二个值为 1 的 JavaPairRDD 下面创建。

JavaPairRDD<Integer, Integer> c1;

为了得到这个,首先你必须从 cw JavaPairRDD 中提取 JavaRDD,为此你必须调用 map 函数,如下所示。我们将从对中提取第一个值。

JavaRDD<Integer> cw1 = cw.map(tuple -> tuple._1());

现在您将使用如下所示的 mapToPair 函数从 JavaRDD 创建新的 JavaPairRDD。

JavaPairRDD<Integer, Integer> c1 = cw1.mapToPair(i -> new Tuple2<Integer, Integer>(i, 1));

在单行中你可以这样写

JavaPairRDD<Integer, Integer> c1 = cw.map(tuple -> tuple._1()).mapToPair(i -> new Tuple2<Integer, Integer>(i, 1));

简直……cw.mapValues(v -> 1);

来自 api 文档 JavaPairRDD.mapValues() ...

Pass each value in the key-value pair RDD through a map function without changing the keys; this also retains the original RDD's partitioning.

这是您可以尝试的方法:

JavaPairRDD<Integer, Integer> tuples = filtered.mapToPair(
                                            f -> new Tuple2<Integer, Integer>(
                                                       Integer.parseInt(f[0]), 
                                                       Integer.parseInt(f[1])
                                       ));