2017-10-21 476 views
2

我想提高我的Spark Scala技能,我有这种情况下我找不到操作的方法,所以请指教!Spark:列值的百分比百分比

我有原始数据如下图所示波纹管是:

enter image description here

我要计算的数列的每个结果的百分比。例如。最后一个错误值是64,占所有列值的百分比是多少。请注意,我用的sqlContext读取原始数据Dataframes: 这里是我的代码:

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

我想类似这样的结果:提前

enter image description here

谢谢!

+1

可否请你添加一些你一起玩​​线上游戏到目前为止的代码示例? – Pavel

+0

我正在使用..... groupBy(“Code”)。agg(count(“Code”)from large data file and I am results results like the table Original data。现在我想计算每个计数值的百分比作为显示在'计数'列 –

+0

请分享您使用的代码示例,即使其完全错误,这将帮助人们了解问题并给您建议等 – Pavel

回答

5

使用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()) 
+0

首先,非常感谢你的回复。在你的代码中稍作修改后,我设法得到了我所需要的东西。就我而言,因为我有'代码'和'计数'的列,所以我不得不同时避免重新计数和分组代码值并获得相同的百分比,因为系统将重新计算代码值,然后百分比将始终相等。这里我做了什么:.groupBy(“Code”,“count”).agg(sum(“count”)as“count1”) .withColumn(“fraction”,col(“count”)/ sum(“count1” ).over())并完美工作(: –

+3

@FoaadMohamadHaddod如果答案帮助你consdier [接受](https://stackoverflow.com/help/someone-answers) – Shaido

+0

不需要groupBy(“Code” ,“count”)只是groupBy(“Code”,)。 – thebluephantom

0

检查您输入dataframe和输出dataframe,下面可能是您的解决方案。

import org.apache.spark.sql.functions._ 
df.withColumn("a", lit("a")).join(broadcast(df.select(lit("a"), sum("count").as("sum"))), Seq("a")) 
    .select($"Code", $"count", ($"count"/$"sum").as("average"), (($"count"/$"sum")*100).as("*100")) 

你应该得到你想要的输出

+----+-----+-------------------+------------------+ 
|Code|count|average   |*100    | 
+----+-----+-------------------+------------------+ 
|58 |926 |0.5402567094515752 |54.02567094515752 | 
|108 |438 |0.2555425904317386 |25.55425904317386 | 
|7 |176 |0.10268378063010501|10.268378063010502| 
|64 |174 |0.10151691948658109|10.15169194865811 | 
+----+-----+-------------------+------------------+ 

说明

两个dataframe s为join ED和所需的列select

第一数据帧是df.withColumn("a", lit("a"))和第二个数据帧是df.select(lit("a"), sum("count").as("sum"))。他们与共同的列a加入。最后选择重要的专栏。

我希望答案是有帮助的让你最终所需要的数据帧