我有一個火花資料框如下。
val df = Seq(("a",1,1400),("a",1,1250),("a",2,1200),("a",4,1250),("a",4,1200),("a",4,1100),("b",2,2500),("b",2,1250),("b",2,500),("b",4,250),("b",4,200),("b",4,100),("b",4,100),("b",5,800)).
toDF("id","hierarchy","amount")
我正在使用 Scala 語言來利用這個資料框并試圖獲得如下所示的結果。
val df = Seq(("a",1,1400),("a",4,1250),("a",4,1200),("a",4,1100),("b",2,2500),("b",2,1250),("b",4,250),("b",4,200),("b",4,100),("b",5,800)).
toDF("id","hierarchy","amount")
規則:按 id 分組,如果 min(hierarchy)==1 則我取金額最高的行,然后繼續分析層次結構 >= 4并按數量的降序取 3 個。另一方面,如果 min(hierarchy)==2 則我取金額最高的兩行,然后我繼續分析層次結構 >= 4并按數量的降序對每行取 3 個。對資料中的所有 id 依此類推。
謝謝你的建議。。
uj5u.com熱心網友回復:
您可以使用視窗函式來生成您將過濾的標準,例如
val results = df.withColumn("minh",min("hierarchy").over(Window.partitionBy("id")))
.withColumn("rnk",rank().over(Window.partitionBy("id").orderBy(col("amount").desc())))
.withColumn(
"rn4",
when(col("hierarchy")>=4, row_number().over(
Window.partitionBy("id",when(col("hierarchy")>=4,1).otherwise(0)).orderBy(col("amount").desc())
) ).otherwise(5)
)
.filter("rnk <= minh or rn4 <=3")
.select("id","hierarchy","amount")
注意。更詳細的過濾器.filter("(rnk <= minh or rn4 <=3) and (minh in (1,2))")
以上由視窗函式生成的輔助過濾條件的臨時列是
minh: 用于確定組 id 的最小層次結構,然后從組中選擇最高的 minh 列數。rnk用于確定每組中金額最高的行rn4用于確定層級 >=4 的每個組中金額最高的行
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/363979.html
