hadoop 使用“窗口上方”的多个聚集函数(Concat和max)

aelbi1ox  于 2022-11-01  发布在  Hadoop
关注(0)|答案(1)|浏览(190)

我是Spark的初学者,有没有办法在同一个窗口上为两个不同的列应用多个聚集函数?在我的例子中,我想应用concat和max
我有一个这样的数据集(DS1)。

+-----+--------------+---------+--------------+
|Col_1|Col_2         | Col_3   + Col_4        |
+-----+--------------+---------+--------------+
|  1  |  aa          |10       + test_1_1     +
|  1  |  bb          |20       + test_1_2     +
|  2  |  cc          |30       + test_2_1     +
|  2  |  dd          |40       + test_2_2     +

我想得到这样的东西(DS2)

+-----+--------------+---------+--------------+--------
|Col_1|Col_2         | Col_3   + Col_5                |
+-----+--------------+---------+----------------------+
|  1  |  bb          |20       + test_1_2;test_1_1    +
|  2  |  dd          |40       + test_2_2;test_2_1    +
------|--------------|---------+----------------------+

我知道如何在窗口上应用max函数,但如何添加串联以获得数据集DS2

val partitionColumns = Seq(
    "Col_1"
  )
     df.withColumn(
              "max_Col_3",
              max(col("Col_3")) over Window
                .partitionBy(
                  partitionColumns .map(col): _*
                )
            )
    .filter(col("max_Col_3").equalTo(col("Col_3")))
    .drop("max_Col_3")
jyztefdp

jyztefdp1#

您可以使用sql expr来分别取得col2col3col5

val DS2 = DS1.groupBy("col_1").agg(expr("max(col_2) as col_2"), expr("max(col_3) as col_3"), expr("array_join(collect_list(col_4), ';') as col_5"))
DS2.show()

相关问题