Спарк-код для объединения слов, начинающихся с одной буквы.
У нас есть пример данных слов, разделенных пробелом. Мы преобразуем его в JavaPairRDD ‹Character, String›
SparkSession sparkSession = SparkSession.builder().appName("combineByKey").getOrCreate(); JavaSparkContext javaSparkContext = new JavaSparkContext(sparkSession.sparkContext()); List<String> data = Arrays.asList("bat", "mat", "hat", "rat", "cat", "ball", "mud", "hut"); JavaPairRDD<Character,String> distData = javaSparkContext.parallelize(data).mapToPair(t -> new Tuple2<>(t.charAt(0), t));
Теперь данные представлены следующим образом:
<b, bat> <m, mat> <h, hat> ..... ..... <h, hut>
Теперь мы будем использовать CombineByKey для агрегирования первого символа.
Function<String, List<String>> createCombiner = data -> { List<String> list = new ArrayList<>(); list.add(data); return list; }; Function2<List<String>, String, List<String>> mergeValue = (list, data) -> { list.add(data); return list; }; Function2<List<String>, List<String>, List<String>> mergeCombiners = (v1, v2) -> { v1.addAll(v2); return v1; };
Теперь используйте вышеуказанные функции, чтобы получить окончательный ответ.
JavaPairRDD<Character, List<String>> response = distData.combineByKey(createCombiner, mergeValue, mergeCombiners);
Окончательный ответ
b , [bat, ball] h , [hat, hut] r , [rat] m , [mat, mud] c , [cat]