У меня есть структура набора данных в Spark с двумя столбцами, один называется user
, а другой - category
. Так что таблица выглядит примерно так:
+---------------+---------------+
| user| category|
+---------------+---------------+
| garrett| syncopy|
| garrison| musictheory|
| marta| sheetmusic|
| garrett| orchestration|
| harold| chopin|
| marta| russianmusic|
| niko| piano|
| james| sheetmusic|
| manny| violin|
| charles| gershwin|
| dawson| cello|
| bob| cello|
| george| cello|
| george| americanmusic|
| bob| personalcompos|
| george| sheetmusic|
| fred| sheetmusic|
| bob| sheetmusic|
| garrison| sheetmusic|
| george| musictheory|
+---------------+---------------+
only showing top 20 rows
Каждая строка в таблице уникальна, но пользователь и категория могут появляться несколько раз. Цель состоит в том, чтобы подсчитать количество пользователей двух категорий. Например, cello
и americanmusic
имеют общего пользователя с именами george
и musictheory
и sheetmusic
имеют общих пользователей george
и garrison
. Цель состоит в том, чтобы получить количество различных пользователей между n категориями, что означает, что между категориями имеется не более n квадратов ребер. Я частично понимаю, как выполнить эту операцию, но я немного пытаюсь преобразовать свои мысли в Spark Java.
Я считаю, что мне нужно выполнить самосоединение на user
, чтобы получить таблицу, которая была бы структурирована следующим образом:
+---------------+---------------+---------------+
| user| category| category|
+---------------+---------------+---------------+
| garrison| musictheory| sheetmusic|
| george| musictheory| sheetmusic|
| garrison| musictheory| musictheory|
| george| musictheory| musicthoery|
| garrison| sheetmusic| musictheory|
| george| sheetmusic| musictheory|
+---------------+---------------+---------------+
Операция самосоединения в Spark (код Java) несложна:
Dataset<Row> newDataset = allUsersToCategories.join(allUsersToCategories, "users");
Это что-то получается, однако я получаю сопоставления с той же категорией, что и в строках 3 и 4 в приведенном выше примере, и я получаю обратные сопоставления, где категории меняются местами, так что по сути это двойной учет каждого взаимодействия с пользователем, как в строках 5 и 6 таблицы выше пример.
Что я думаю, что мне нужно сделать, так это иметь какое-то условное выражение в моем соединении, которое говорит что-то вроде X < Y
, чтобы одинаковые категории и дубликаты были выброшены. Наконец, мне нужно подсчитать количество отдельных строк для n возведенных в квадрат комбинаций, где n - количество категорий.
Может ли кто-нибудь объяснить, как это сделать в Spark и, в частности, в Spark Java, поскольку я немного не знаком с синтаксисом Scala?
Спасибо за помощь.