Spark:计算列值的百分比和百分数

10

我正在尝试提高我的Spark Scala技能,但是我有一个问题没有办法解决,请给予建议!

我有如下所示的原始数据:

enter image description here

我想计算每个count列结果的百分比。例如,最后一个error值为64,那么所有列值中的64占多少百分比。请注意,我使用sqlContext将原始数据读取为Dataframes:

这是我的代码:

    val df1 = df.groupBy(" Code")
.agg(sum("count").alias("sum"), mean("count")
.multiply(100)
.cast("integer").alias("percentag‌​e")) 

我希望能够得到类似这样的结果:

输入图像描述

提前感谢!


1
请问您能否添加一些您目前正在使用的代码示例? - Pavel
我正在使用groupBy(“Code”).agg( count(“Code”))从大数据文件中获取结果,而且我收集的结果类似于原始数据表。现在,我想要计算每个数值的百分比,如列“count”所示。 - Foaad Mohamad Haddod
请分享您正在使用的代码示例,即使它完全错误,这也有助于人们理解问题并为您提供建议等。 - Pavel
我已经尝试了这段代码,但它没有给我百分比结果。val df1 = df.groupBy("Code").agg(sum("count").alias("sum"), mean("count").multiply(100).cast("integer").alias("percentage")) - Foaad Mohamad Haddod
1个回答

14

使用 agg 和窗口函数:

import org.apache.spark.sql.expressions._
import org.apache.spark.sql.functions._

df
  .groupBy("code")
  .agg(sum("count").alias("count"))
  .withColumn("fraction", col("count") /  sum("count").over())

1
首先,非常感谢您的回复。通过对您的代码进行一些小修改,我成功地得到了我需要的结果。在我的情况下,由于我有“Code”和“count”两列,我必须同时对它们进行分组以避免重新计算和分组Code值并获得相等的百分比,因为系统将重新计算Code值,然后百分比将始终相等。这是我所做的:.groupBy(“Code”,“count”)。agg(sum(“count”)as“count1”) .withColumn(“fraction”,col(“count”)/ sum(“count1”).over()),并且完美地工作(: - Foaad Mohamad Haddod
不需要使用groupBy("Code", "count"),只需使用groupBy("Code")。 - thebluephantom
3
嗨,我收到了“over() takes exactly 2 arguments (1 given)”的错误消息,为什么会这样? - ZK Zhao
你会如何使用普通的Spark SQL来完成这个任务? - Dalupus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接