我有一个关于列连接日志的数据框架 Id
, targetIP
, Time
. 此Dataframe中的每个记录都是一个系统的连接事件。id表示这个连接, targetIP
表示这次的目标ip地址,time是连接时间。具有值:
IDTimeTargetIP1192.163.0.122192.163.0.233192.163.0.145192.163.0.156192.163.0.267192.163.0.278192.163.0.2
我想在某些条件下创建一个新列:在过去的2个时间单位中,与此时间的目标ip地址的连接数。因此,结果Dataframe应该是:
idtimetargetipcount11192.163.0.1022192.163.0.2033192.163.0.1145192.163.0.1156192.163.0.2067192.163.0.2178192.163.0.22
例如, ID=7
,的 targetIP
是 192.163.0.2
在过去2个时间单位内连接到系统 ID=5
以及 ID=6
,以及他们的 targetIP
也是 192.163.0.2
. 那么伯爵 ID=7
是2。
期待您的帮助。
2条答案
按热度按时间jq6vz3qz1#
你可以用
count
在范围介于-2和当前行之间的窗口上,以获取最近2个时间单位中的ip计数。使用spark sql可以执行以下操作:
或使用Dataframeapi:
7rtdyuoh2#
所以,你基本上需要的是一个窗口函数。
让我们从你的初始数据开始
现在我们需要定义一个窗口函数本身
现在最有趣的部分是:如何在Windows上数东西?没有简单的方法,因此我们将执行以下操作
将所有目标IP聚合到列表中
筛选列表以仅查找所需的IP
计算列表的大小
结果将包含我们需要的新列“count”!
升级版本:
有一个更简短的版本,没有聚合,由@blackbishop编写,