我有一個 spark DataFrame,其中有一列包含多個不同長度的整數陣列。我將需要創建一個新列來查找每一個的分位數。這是輸入資料幀:
--------- ------------------------
|Comm |List_Nb_total_operations|
--------- ------------------------
| comm1| [1, 1, 2, 3, 4]|
| comm4| [2, 2]|
| comm3| [2, 2]|
| comm0| [1, 1, 1, 2, 2, 2, 3,3]|
| comm2| [1, 1, 1, 2, 3]|
--------- ------------------------
這是想要的結果:
--------- ------------------------ ---- ----
|Comm |List_Nb_total_operations|QT25|QT75|
--------- ------------------------ ---- ----
| comm1| [1, 1, 2, 3, 4]| 1| 3|
| comm4| [2, 2]| 2| 2|
| comm3| [2, 2]| 2| 2|
| comm0| [1, 1, 1, 2, 2, 2, 3,3]| 1| 3|
| comm2| [1, 1, 1, 2, 3]| 1| 2|
--------- ------------------------ ---- ----
uj5u.com熱心網友回復:
您要使用的功能是percentile_approx(自 Spark 3.1 起):
val df = Seq(
("comm1", Seq(1,1,2,3,4)),
("comm4", Seq(2,2)),
("comm3", Seq(2,2)),
("comm0", Seq(1,1,1,2,2,2,3,3)),
("comm2", Seq(1,1,1,2,3))
).toDF("Comm", "ops")
val dfQ = df.select(
col("Comm"),
explode(col("ops")) as "ops")
.groupBy("Comm")
.agg(
percentile_approx($"ops", lit(0.25), lit(100)) as "q25",
percentile_approx($"ops", lit(0.75), lit(100)) as "q75"
)
val dfWithQ = df.join(dfQ, Seq("Comm"))
該檔案包含有關調整引數以提高準確性的更多資訊。
uj5u.com熱心網友回復:
感謝您的幫助。我找到了另一個在我的情況下效果很好的解決方案:
import org.apache.spark.sql.functions._
import org.apache.spark.sql.Column
import org.apache.spark.sql.catalyst.expressions.aggregate.ApproximatePercentile
def percentile_approxx(col: Column, percentage: Column, accuracy: Column): Column = {
val expr = new ApproximatePercentile(
col.expr, percentage.expr, accuracy.expr
).toAggregateExpression
new Column(expr)
}
val perc_df = df.groupBy("Comm").agg(percentile_approxx(col("ops"), lit(0.75), lit(100)))
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/327841.html
上一篇:使用Seq自動衍生的Cats
