Группа искр по ключу (строка, повторяемость <String>) - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь сгруппировать urldata по ключу, где значения будут строки

Пример данных:

url_3 url_2
url_3 url_2
url_3 url_1
url_4 url_3
url_4 url_1

Ожидаемый результат:

(url_3,(url_2,url_1))
(url_4,(url_3,url_1))

1) Загрузитьthe urldata:

Dataset<String> lines = spark.read()
    .textFile("C:/Users/91984/workspace/myApp/src/test/resources/in/urldata.txt");

2) Разделить набор данных по пробелу

Encoder<Tuple2<String, String>> encoder2 = 
    Encoders.tuple(Encoders.STRING(), Encoders.STRING());
Dataset<Tuple2<String, String>> tupleRDD = lines.map(f->{
    Tuple2<String, String> m = 
        new Tuple2<String, String>(f.split(" ")[0], f.split(" ")[1]);
    return m;
},encoder2);

3) Использовать groupbyKey для группировки базы данных tupleRDD по ключу

KeyValueGroupedDataset<String, Tuple2<String, String>> keygrpDS = 
    tupleRDD.groupByKey(f->f._1, Encoders.STRING());

Может кто-тообъясните мне, почему groupByKey на шаге 3 возвращает KeyValueGroupedDataset<String, Tuple2<String, String>> вместо KeyValueGroupedDataset<String, Iterable<String>>, и что будет сделано для получения ожидаемых результатов.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Spark требует от вас следовать groupBY методом aggregation.Я бы имел tupleRDD как DataFrame вроде:

column1 column2

url_3 url_2
url_3 url_2
url_3 url_1
url_4 url_3
url_4 url_1

и передал бы collect_list(column2) как

df.groupBy('column1').agg('column2', collect_list('column2')).

Этот пример на Python.Тем не менее, API-интерфейсы Scala / Java должны быть похожими.

0 голосов
/ 24 ноября 2018

Так работает с наборами данных в искре.Если у вас есть набор данных типа Dataset<T>, вы можете сгруппировать его с помощью некоторой функции отображения, которая принимает объект типа T и возвращает объект типа K (ключ).Вы получаете KeyValueGroupedDataset<K,T>, для которого вы можете вызвать функцию агрегирования (см. javadoc ).В вашем случае вы можете использовать mapGroups, для которого вы можете предоставить функцию, которая отображает ключ K и итерацию Iterable<T> на новый объект R по вашему выбору.Если это поможет, в вашем коде T - Tuple2, а K - URL.

...