Spark Scala groupПо объединению - PullRequest
       7

Spark Scala groupПо объединению

0 голосов
/ 23 октября 2018

У меня есть следующий Spark DataFrame, которым я манипулирую в блокноте данных, давайте назовем фрейм данных df:

src tgt
1   2
1   3
1   4
2   1
2   3
2   5
3   4
4   2
4   5
4   6
5   2

Мне нужно взять данные и подсчитать количество исходящих ребер из srcк цели и от цели до ср.Как показано ниже:

node    out_deg in-deg  total_deg
1       3       1       4
2       3       3       6
3       1       2       3
4       3       2       5
5       1       2       3
6       0       1       1

Например: узел 4 имеет 3 выходящих ребра (до 2, 5 и 6) и 2 входящих ребра (от 1 и 3).Это общее число ребер = in + out = 3 + 2 = 5.

Как мне это сделать?

1 Ответ

0 голосов
/ 23 октября 2018

Вы можете выполнить fullouter объединение результатов группы по src и tgt отдельно:

df.groupBy("src").count().as("srcs")
  .join(df.groupBy("tgt").count().as("tgts"), $"src" === $"tgt", "fullouter")
  .select(
    coalesce($"src", $"tgt") as "node",
    coalesce($"srcs.count", lit(0)) as "out_deg",
    coalesce($"tgts.count", lit(0)) as "in_deg"
  ).withColumn("total_deg", $"in_deg" + $"out_deg")
  .orderBy($"node")
  .show()

// +----+-------+------+---------+
// |node|out_deg|in_deg|total_deg|
// +----+-------+------+---------+
// |   1|      3|     1|        4|
// |   2|      3|     3|        6|
// |   3|      1|     2|        3|
// |   4|      3|     2|        5|
// |   5|      1|     2|        3|
// |   6|      0|     1|        1|
// +----+-------+------+---------+

НО: могут быть более эффективные решения, и я бы также порекомендовализучая Spark GraphX ​​, который, вероятно, имеет для этого некоторые встроенные инструменты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...