首页 > 解决方案 > Apache spark窗口,根据某些条件选择上一个最后一项

问题描述

我有一个输入数据,它有 id、pid、pname、ppid,它们是 id(可以认为是时间)、pid(进程 id)、pname(进程名称)、ppid(父进程 id)谁创建了 pid

+---+---+-----+----+
| id|pid|pname|ppid|
+---+---+-----+----+
|  1|  1|    5|  -1|
|  2|  1|    7|  -1|
|  3|  2|    9|   1|
|  4|  2|   11|   1|
|  5|  3|    5|   1|
|  6|  4|    7|   2|
|  7|  1|    9|   3|
+---+---+-----+----+

现在需要找到 ppname(父进程名称),它是以下条件的最后一个 pname(以前的 pname)previous.pid == current.ppid

上一个示例的预期结果:

+---+---+-----+----+------+
| id|pid|pname|ppid|ppname|
+---+---+-----+----+------+
|  1|  1|    5|  -1|    -1|
|  2|  1|    7|  -1|    -1| no item found above with pid=-1
|  3|  2|    9|   1|     7| last pid = 1(ppid) above, pname=7
|  4|  2|   11|   1|     7| 
|  5|  3|    5|   1|     7|
|  6|  4|    7|   2|    11| last pid = 2(ppid) above, pname=11 
|  7|  1|    9|   3|     5| last pid = 3(ppid) above, pname=5
+---+---+-----+----+------+

我可以基于pid==ppid然后在 id 之间获取差异并选择具有最小正差异的行自行加入,然后对于我们没有找到任何正差异的情况(-1 案例)再次加入。

但我认为它几乎就像一个交叉连接,因为我有 100M 行,所以我可能买不起。

标签: sqlapache-sparkapache-spark-sqlwindow-functionsapache-spark-dataset

解决方案


推荐阅读