繁体   English   中英

Spark 3.0 排序并应用于组 Scala/Java

[英]Spark 3.0 Sort and apply on group Scala/Java

我有 spark DataSet 让我们用列 A,B,C 查看

我要获取数据集

  • 在 A 列上分组
  • B 列上的排序组(不是整个数据集)
  • 遍历单个组,在连续 N 行之间查找一些序列/模式,并根据 forms 生成数据集的标准返回行

在 Flink 中

dataset.groupBy(0).sortGroup(1, Order.ASCENDING)
                .reduceGroup({})

在 Pyspark

我们可以调用 apply function 和 Pandas 在组上并在 pandas 中排序但是与 Flink 相比它非常慢 10 倍

注意:我想对分组数据进行处理并返回另一个不是标准聚合的数据集

有人可以向我指出有关如何在 Spark 中的 java/scala 中执行的类似代码吗?

几种可能的方法取决于迭代逻辑:

使用数据集 API

给定

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

实现自定义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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM