如何解决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
字段始终相同且不会更改。
我找到了使用多个连接的解决方案:对每列分别使用 groupby
和 pivot
,然后在输出 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 举报,一经查实,本站将立刻删除。