微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pyspark 在多个列上透视,无需连接或减少

如何解决Pyspark 在多个列上透视,无需连接或减少

我需要计算多列中每个值的出现次数,并按所有列的相同字段的输出分组。例如:

+-------------+----+----------+-------+---------+
|  date       | id |   col1   | col2  |    col3 |
+-------------+----+----------+-------+---------+
|   2020-12-15|   1|   Summery|   Rose|  MENTION|
|   2020-12-15|   1|      Chat|   Rose|      NTF|
|   2020-12-15|   2|      Tabs|   Gold|      SET|
|   2020-12-15|   2|      Tabs|  White| REMINDER|
|   2020-12-14|   1|   Summery|  Green| REMINDER|
|   2020-12-14|   1|   Summery|  Green|  MENTION|
|   2020-12-14|   2|   Summery|   Blue|      SET|
|   2020-12-14|   2|      Tabs|  White|      SET|
|   2020-12-14|   3|      Chat|   Blue|  MENTION|
|   2020-12-13|   2|      Chat|   Gold|  MENTION|
|   2020-12-13|   2|      Chat|   Rose|  MENTION|
|   2020-12-13|   2|      Tabs|   Gold|  MENTION|
|   2020-12-13|   2|      Tabs|   Blue|      NTF|
+-------------+----+----------+-------+---------+

输出应如下所示:

+-----------+---+--------+-----+-----+-----+------+-------+------+-----+--------+----+----+---------+
|  date     | id| Summery| Chat| Tabs| Rose| Gold | White | Green| Blue| MENTION| NTF| SET| REMINDER|
+-----------+---+--------+-----+-----+-----+------+-------+------+-----+--------+----+----+---------+
| 2020-12-13|  2|       0|    2|    2|    1|    2|       0|     0|    1|       3|   1|   0|        0|
| 2020-12-14|  1|       2|    0|    0|    0|    0|       0|     2|    0|       1|   0|   0|        1|
| 2020-12-14|  2|       1|    0|    1|    0|    0|       1|     0|    1|       0|   0|   2|        0|
| 2020-12-14|  3|       0|    1|    0|    0|    0|       0|     0|    1|       1|   0|   0|        0|
| 2020-12-15|  1|       1|    1|    0|    2|    0|       0|     0|    0|       1|   1|   0|        0|
| 2020-12-15|  2|       0|    0|    2|    0|    1|       1|     0|    0|       0|   0|   1|        1|
+-----------+---+--------+-----+-----+-----+-----+--------+------+-----+--------+----+----+---------+

这种透视的列数超过 3,每列中不同值的数量未知。

groupby 字段始终相同且不会更改。

我找到了使用多个连接的解决方案:对每列分别使用 groupbypivot,然后在输出 DF 之间进行连接,但这成本太高了。

我的第二次尝试是使用 reduce 函数

from functools import reduce

cols = ['col1','col2','col3']
df_array = [df.withColumn('col',f.col(x)).select('date','id','col') for x in cols]
df = reduce(DataFrame.unionAll,df_array).groupby('date','id').pivot('col').agg(f.count('col')).fillna(0)

但是这个感觉和使用连接一样。

有没有其他选择可以用更便宜的功能来做我需要的事情?可能是涉及 Window 函数的东西?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。