Каков наиболее эффективный и эффективный способ построения графика из необработанных данных? - PullRequest
0 голосов
/ 05 июля 2019

У меня есть набор данных, содержащий упоминания различных тем в 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, что-то еще?

И, наконец, как мне обновить с новыми краями? Объединить новый список ребер с существующим списком ребер, а затем перестроить график?

Спасибо!

...