我在Pyspark中拥有审核日志数据,我试图找出在任何给定时间有多少人登录到系统。
例如,我正在使用的数据框具有以下结构
time src_comp auth_orient
1 C1 LogOn
2 C1 LogOn
2 C1 LogOn
3 C2 LogOn
3 C1 LogOff
4 C1 LogOn
4 C2 LogOff
5 C1 LogOn
6 C2 LogOn
6 C3 LogOff
然后从我的代码中,我想创建另一个列,以显示登录的人数,如下所示。我也不希望“登录”列变为负数,因此,如果有人注销了我未跟踪的系统,则不想减少该列:
预期输出:
time src_comp LoggedOn
1 C1 1
2 C1 2
3 C2 1
3 C1 1
3 C1 2
4 C2 0
5 C1 3
6 C2 1
6 C3 0
我尝试了以下代码,但出现错误。
auth_dataset.groupby(auth_dataset.time,auth_dataset.src_comp).agg(F.when(auth_dataset.strt=='LogOn',number+=1).otherwise(number-=1))
答案 0 :(得分:1)
尝试以下代码。它将所有值(1和-1)相加,并且greatest(0,col)
函数确保它永远不会为负。
auth_dataset.groupby('time','src_comp')\
.agg(F.sum(F.when(auth_dataset.auth_orient == 'LogOn', F.lit(1)).otherwise(F.lit(-1))).alias('LoggedOn'))\
.withColumn('LoggedOn', F.greatest(F.lit(0),'LoggedOn'))\
.sort('time','src_comp').show()