Pyspark groupby列,同时有条件地计数另一列

时间:2018-10-07 22:36:24

标签: python pyspark

使用groupBy时,我需要帮助从pyspark获取条件输出。我有以下输入表:

+----+-----------+-------+
|time|auth_orient|success|
+----+-----------+-------+
|   1|      LogOn|Success|
|   1|     LogOff|Success|
|   1|     LogOff|Success|
|   1|      LogOn|Success|
|   1|      LogOn|   Fail|
|   1|      LogOn|Success|
|   2|     LogOff|Success|
|   2|      LogOn|Success|
|   2|      LogOn|Success|
|   2|     LogOff|Success|
|   2|      LogOn|Success|
|   2|      LogOn|Fail   |
|   2|     LogOff|Success|
|   2|      LogOn|Success|
|   2|      LogOn|Success|
|   2|     LogOff|Success|
|   2|      LogOn|Fail   |
|   2|      LogOn|Success|
|   2|      LogOn|Success|
|   2|      LogOn|Success|
+----+-----------+-------+

下表显示了我想要的内容,仅显示登录状态:

+----+-----------+-------+
|time|Fail       |success|
+----+-----------+-------+
|   1|1          |3      |
|   2|2          |8      |
+----+-----------+-------+

总的来说,我试图按时间分组并填充新列,最好是我希望代码填充列名称,因为我将不会总是有完整的列表,并带有计数。

我知道我想做的事情的一部分能够与MultilabelBinarizer一起使用,但是根据我所见,目前在pyspark中还不可用。

1 个答案:

答案 0 :(得分:2)

仅首先将数据帧过滤到LogOn,然后再进行groupBy.pivot

import pyspark.sql.functions as F
df.filter(
    df.auth_orient == 'LogOn'
).groupBy('time').pivot('success').agg(F.count('*')).show()
+----+----+-------+
|time|Fail|Success|
+----+----+-------+
|   1|   1|      3|
|   2|   2|      8|
+----+----+-------+