Spark Scala groupBy 和合并

Spark Scala groupBy and merge

我在数据块笔记本上操作了以下 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 到 目标和从目标到 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.

我该怎么做?

您可以对 srctgt 分组的结果分别执行 fullouter 连接:

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,它可能有一些内置工具。