Spark Scala组由合并合并

时间:2018-10-23 19:12:40

标签: scala apache-spark group-by databricks

我在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。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

您可以分别对fulloutersrc分组的结果执行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,它可能具有一些内置工具。