Я наткнулся на следующий фрагмент кода Apache Spark:
JavaRDD<String> lines = new JavaSparkContext(sparkSession.sparkContext()).textFile("src\\main\\resources\\data.txt");
JavaPairRDD<String, Integer> pairs = lines.mapToPair(s -> new Tuple2(s, 1));
System.out.println(pairs.collect());
JavaPairRDD<String, Integer> counts = pairs.reduceByKey((a, b) -> a + b);
System.out.println("Reduced data: " + counts.collect());
Мой data.txt выглядит следующим образом:
Mahesh
Mahesh
Ganesh
Ashok
Abnave
Ganesh
Mahesh
Вывод:
[(Mahesh,1), (Mahesh,1), (Ganesh,1), (Ashok,1), (Abnave,1), (Ganesh,1), (Mahesh,1)]
Reduced data: [(Ganesh,2), (Abnave,1), (Mahesh,3), (Ashok,1)]
Хотя я понимаю, как получается первая строка вывода, я не понимаю, как получается вторая строка, то есть, как JavaPairRDD<String, Integer> counts
образовано reduceByKey
.
Я обнаружил, что подпись из reduceByKey()
выглядит следующим образом:
public JavaPairRDD<K,V> reduceByKey(Function2<V,V,V> func)
[подпись] (http://spark.apache.org/docs/1.2.0/api/java/org/apache/spark/api/java/function/Function2.html#call(T1, T2)) Function2.call()
выглядит следующим образом:
R call(T1 v1, T2 v2) throws Exception
Объяснение reduceByKey()
гласит следующее:
Объедините значения для каждого ключа, используя ассоциативную функцию сокращения.Это также выполнит слияние локально для каждого преобразователя перед отправкой результатов в редуктор, аналогично «объединителю» в MapReduce.Вывод будет разделен на хеш с существующим уровнем разделения / параллелизма.
Теперь это объяснение звучит несколько смущающим для меня.Может быть, есть что-то еще в функциональности reduceByKey()
.Глядя на ввод и вывод в reduceByKey()
и Function2.call()
, я чувствую, что reducebyKey()
посылает значения тех же клавиш в call()
парами.Но это просто не звучит ясно.Кто-нибудь может объяснить, что именно, как reduceByKey()
и Function2.call()
работают вместе?