【问题标题】:Pyspark groupby column while conditionally counting another columnPyspark groupby 列,同时有条件地计算另一列
【发布时间】:2018-10-07 22:36:24
【问题描述】:

在使用 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 中不可用。

【问题讨论】:

    标签: python pyspark


    【解决方案1】:

    先将数据框过滤到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|
    +----+----+-------+
    

    【讨论】:

    • 这似乎有效,但在运行时出现错误。 (打开 FileSegmentManagedBuffer 时出错)看来我需要配置会话的内存。
    猜你喜欢
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2021-07-02
    • 2011-03-19
    • 2018-03-07
    • 2019-02-24
    相关资源
    最近更新 更多