scala - 如何使用scala将整数列表中的ApproxQuanitiles计算到Spark DataFrame列中
问题描述
我有一个 spark DataFrame,它的一列包含几个长度不同的整数数组。我将需要创建一个新列来查找每一个的分位数。这是输入 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|
+---------+------------------------+----+----+
解决方案
您要使用的功能是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"))
该文档包含有关调整参数以提高准确性的更多信息。
推荐阅读
- javascript - 将 ruby 嵌入到 javascript 字符串中
- javascript - 我不能调用javascript的函数?
- python - Rasa Core TypeError(聊天机器人)
- c# - C# Winform:插入 url 参数
- json - 大型过滤查询的 RESTful 方法
- dart - Dart/Flutter:List.where 在 Observable.combineLatest2 中无法按预期工作
- pandas - 熊猫读取带有日期时间列的 csv
- hl7-fhir - 使用解压的 FHIR 包运行 IG Publisher
- javascript - 如何确保执行该功能以进一步委托流程?
- python - 使用 dataframe.withColumn 和变量似乎不起作用