如何基于Pyspark中其他列的值增加/减少列

时间:2018-12-09 23:16:42

标签: python pyspark

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

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()