import pyspark.sql.functions as F
df.groupby('category').agg(
(F.count('value')).alias('count'),
(F.count('value') / df.count()).alias('percentage')
).show()
df.createOrReplaceTempView('df')
spark.sql(
"""
SELECT category,
COUNT(*) AS count,
COUNT(*) / (SELECT COUNT(*) FROM df) AS ratio
FROM df
GROUP BY category
"""
).show()
4条答案
按热度按时间vi4fp9gy1#
如果对注解中提到的窗口化不满意,则作为替代方案的示例是更好的方法:
退货:
我专注于Scala,这似乎更容易。也就是说,通过注解建议的解决方案使用Window,这是我在Scala中使用over()所做的。
ymdaylpp2#
当
df
本身是一个更复杂的转换链,并且运行两次--首先计算总数,然后分组并计算百分比--开销太大时,可以利用窗口函数来实现类似的结果。下面是一个更通用的代码(扩展了bluephantom的answer),它可以与许多group-by维一起使用:pexxcrt23#
您可以使用
groupby
并使用agg
进行聚合。例如,对于以下DataFrame:您可以用途:
输出:
或者,您可以使用SQL:
yx2lnoni4#
更多的“美化”输出,消除多余的小数和排序