簡體   English   中英

根據條件取 sum ini spark-scala

[英]Taking sum ini spark-scala based on a condition

我有一個這樣的數據框。 我如何計算排名大於 3 的列銷售額的總和,每個“M”

+---+-----+----+
|  M|Sales|Rank|
+---+-----+----+
| M1|  200|   1|
| M1|  175|   2|
| M1|  150|   3|
| M1|  125|   4|
| M1|   90|   5|
| M1|   85|   6|
| M2| 1001|   1|
| M2|  500|   2|
| M2|  456|   3|
| M2|  345|   4|
| M2|  231|   5|
| M2|  123|   6|
+---+-----+----+

預期產出——

+---+-----+----+---------------+
|  M|Sales|Rank|SumGreaterThan3|
+---+-----+----+---------------+
| M1|  200|   1|            300|
| M1|  175|   2|            300|
| M1|  150|   3|            300|
| M1|  125|   4|            300|
| M1|   90|   5|            300|
| M1|   85|   6|            300|
| M2| 1001|   1|            699|
| M2|  500|   2|            699|
| M2|  456|   3|            699|
| M2|  345|   4|            699|
| M2|  231|   5|            699|
| M2|  123|   6|            699|
+---+-----+----+---------------+

我已經像這樣完成了對 ROwnumber 的求和

df.withColumn("SumGreaterThan3",sum("Sales").over(Window.partitionBy(col("M"))))` //But this will provide total sum of sales.

復制相同的 DF-

val df = Seq(
("M1",200,1),
("M1",175,2),
("M1",150,3),
("M1",125,4),
("M1",90,5),
("M1",85,6),
("M2",1001,1),
("M2",500,2),
("M2",456,3),
("M2",345,4),
("M2",231,5),
("M2",123,6)
).toDF("M","Sales","Rank")

好吧,分區足以設置window函數。 當然,您還必須通過混合sumwhen來使用條件求和。

import org.apache.spark.sql.expressions.Window
val w = Window.partitionBy("M")
df.withColumn("SumGreaterThan3", sum(when('Rank > 3, 'Sales).otherwise(0)).over(w).alias("sum")).show

這將為您提供預期的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM