2017-10-21 482 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加入。最後選擇重要的專欄。

我希望答案是有幫助的讓你最終所需要的數據幀