[英]Spark 3.0 Sort and apply on group Scala/Java
我有 spark DataSet 让我们用列 A,B,C 查看
我要获取数据集
dataset.groupBy(0).sortGroup(1, Order.ASCENDING)
.reduceGroup({})
我们可以调用 apply function 和 Pandas 在组上并在 pandas 中排序但是与 Flink 相比它非常慢 10 倍
注意:我想对分组数据进行处理并返回另一个不是标准聚合的数据集
有人可以向我指出有关如何在 Spark 中的 java/scala 中执行的类似代码吗?
几种可能的方法取决于迭代逻辑:
给定
val df =
Seq(("a", 0, "foo"), ("b", 1, "foo"), ("a", 1, "foobar"))
.toDF("A", "B", "C")
首先对其进行一些预处理
df.select($"A", struct($"B", $"C") as $"S").show()
要得到
+---+-----------+
| A| S|
+---+-----------+
| a| [0, foo]|
| b| [1, foo]|
| a|[1, foobar]|
+---+-----------+
现在我们可以将任何 Scala 代码应用于元组 S 的序列,包括排序:
df.select($"A", struct($"B", $"C") as $"S")
.groupBy("A")
.agg(collect_list("S"))
.as[(String, Seq[(Int, String)])]
.map {
case (a, l) => (a, l.sortBy(_._1).map(_._2).maxBy(_.length))
}
.show()
实现自定义UDAF :
class MyAgg extends Aggregator[
(Int, String),
mutable.ListBuffer[(Int, String)],
/* any output type here */] {
...
并使用它聚合:
val myagg = udaf(new MyAgg())
df.select($"A", struct($"B", $"C") as "S").groupBy($"A").agg(myagg($"S"))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.