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.
我该怎么做?
您可以对 src
和 tgt
分组的结果分别执行 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,它可能有一些内置工具。
我在数据块笔记本上操作了以下 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.
我该怎么做?
您可以对 src
和 tgt
分组的结果分别执行 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,它可能有一些内置工具。