我在Databricks笔记本上操作了以下Spark DataFrame,
我们将其称为数据帧const navCmds$ = new Subject<any>();
setTimeout(() => {navCmds$.next('A')}, 30);
setTimeout(() => {navCmds$.next('B')}, 80);
setTimeout(() => {navCmds$.next('C')}, 120);
setTimeout(() => {navCmds$.next('A')}, 150);
setTimeout(() => {navCmds$.next('D')}, 220);
setTimeout(() => {navCmds$.next('C1')}, 320);
setTimeout(() => {navCmds$.next('D1')}, 380);
setTimeout(() => {navCmds$.next('E')}, 430);
const navNotifications$ = new Subject<any>();
setTimeout(() => {navNotifications$.next('A')}, 50);
setTimeout(() => {navNotifications$.next('X1')}, 100);
setTimeout(() => {navNotifications$.next('X2')}, 110);
setTimeout(() => {navNotifications$.next('B')}, 130);
setTimeout(() => {navNotifications$.next('Y1')}, 140);
setTimeout(() => {navNotifications$.next('Y2')}, 150);
setTimeout(() => {navNotifications$.next('C')}, 160);
setTimeout(() => {navNotifications$.next('A')}, 180);
setTimeout(() => {navNotifications$.next('D')}, 230); // slightly delayed
setTimeout(() => {navNotifications$.next('C1')}, 390); // inverted
setTimeout(() => {navNotifications$.next('D1')}, 400); // inverted
setTimeout(() => {navNotifications$.next('A1')}, 410);
setTimeout(() => {navNotifications$.next('A2')}, 420);
setTimeout(() => {navNotifications$.next('A3')}, 440);
setTimeout(() => {navNotifications$.next('E')}, 460);
:
df
我需要获取数据并计算从src到 目标以及从目标到src。如下。
src tgt
1 2
1 3
1 4
2 1
2 3
2 5
3 4
4 2
4 5
4 6
5 2
例如:节点4具有3个边缘出(到2、5和6)和2个边缘进入(从1和3)。 总边数=进+出= 3 + 2 = 5。
我该怎么做?
答案 0 :(得分:2)
您可以分别对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,它可能具有一些内置工具。