Вы можете выполнить 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 , который, вероятно, имеет для этого некоторые встроенные инструменты.