У меня есть набор данных, содержащий упоминания различных тем в Reddit, который выглядит следующим образом:
+------------+-------+-----------+---------------+
| Year_month | Topic | Subreddit | Mention_count |
+------------+-------+-----------+---------------+
| 2018_01 | Obama | Politics | 300 |
| 2018_01 | Obama | AskReddit | 200 |
| 2018_01 | Obama | Pics | 100 |
| 2018_01 | Trump | Politics | 500 |
| 2018_01 | Trump | AskReddit | 150 |
| 2018_02 | Trump | AskReddit | 180 |
+------------+-------+-----------+---------------+
Цель состоит в том, чтобы построить мультиграф, где,
- Узлы - это темы.
- Края создаются между темами, если они встречаются внутри подредита, причем вес является наименьшим из двух значений упоминаний тем.
Таким образом, приведенная выше таблица создаст граф с двумя узлами, один из которых называется Трамп , а другой - Обама . Они будут связаны двумя ребрами, одно из которых будет представлять совпадения в пределах субредита Politics с весом 300, а другое - для совпадений внутри AskReddit с весом 150.
Я обычно работаю в Python / Pandas, но этот график будет содержать несколько миллионов узлов и сотни миллионов ребер, поэтому я хочу сделать это в Scala / Spark с использованием GraphFrames.
Какой самый эффективный способ Sparky (в отличие от Pythonic) для построения списка ребер, а затем и графика из приведенных выше данных?
Мое первоначальное мышление (для данных за один месяц) состоит в том, чтобы использовать внутреннее объединение для построения списка ребер, например:
val df_filtered = df.filter($"year_month" === "2018_01")
val df_edges = df_filtered.join(df_filtered, Seq("subReddits"), "inner")
, который возвращает
+-----------+------------+-------+-------+---------------+---------------+
| Subreddit | Year_month | Topic | Topic | Mention_count | Mention_count |
+-----------+------------+-------+-------+---------------+---------------+
| Politics | 2018_01 | Obama | 300 | Obama | 300 |
| AskReddit | 2018_01 | Obama | 200 | Obama | 200 |
| Pics | 2018_01 | Obama | 100 | Obama | 100 |
| Politics | 2018_01 | Obama | 300 | Trump | 500 |
| AskReddit | 2018_01 | Obama | 200 | Trump | 150 |
| Politics | 2018_01 | Trump | 500 | Obama | 300 |
| AskReddit | 2018_01 | Trump | 150 | Obama | 200 |
| Politics | 2018_01 | Trump | 500 | Trump | 500 |
| AskReddit | 2018_01 | Trump | 150 | Trump | 150 |
+-----------+------------+-------+-------+---------------+---------------+
А затем вычеркнуть ненужную информацию и построить график с помощью GraphFrame(v, e)
Хотя это сжато, оно кажется медленным и приводит к множеству дублирующих и избыточных строк, что может стать большой проблемой при увеличении размера данных.
Какой самый эффективный способ сделать это? Было бы лучше использовать цикл for или что-то еще?
Кроме того, какой тип данных я должен использовать, Dataframe, RDD, что-то еще?
И, наконец, как мне обновить с новыми краями? Объединить новый список ребер с существующим списком ребер, а затем перестроить график?
Спасибо!