首页 > 解决方案 > 如何在子查询scala spark中使用聚合函数

问题描述

我有一个数据框,我在查询中的子查询中汇总两个日期“max(openday) 和 openday”的差异。我需要将 max(opday) 和 opday 之间的差异的新列添加到 a_table 我该怎么做?

我尝试使用:

a_table.alias("a").join(b_table.alias("b"), $"a.name == "b.name", "left")
 .withColumn("difference", 
    when(condition, datediff(a.agg(max("opday").alias("max"))("max"), $"opday"))

val a_table = Seq(
    ("James", Date.valueOf("2021-07-22"), Date.valueOf("2021-01-01"), 600.0),
    ("James", Date.valueOf("2021-05-01"), Date.valueOf("2021-01-01"), 600.0),
    ("James", Date.valueOf("2021-01-05"), Date.valueOf("2021-01-01"), 600.0),
    ("James", Date.valueOf("2021-03-04"), Date.valueOf("2021-01-01"), 600.0),
    ("James", Date.valueOf("2021-02-12"), Date.valueOf("2021-01-01"), 600.0)
).toDF("name", "openday", "current_date", "salary")

val b_table = Seq(
        ("James", Date.valueOf("2021-01-01"), Date.valueOf("2021-01-01"), 600.0),
        ("James", Date.valueOf("2021-01-02"), Date.valueOf("2021-01-01"), 600.0),
        ("James", Date.valueOf("2021-01-03"), Date.valueOf("2021-01-01"), 600.0),
        ("James", Date.valueOf("2021-01-07"), Date.valueOf("2021-01-01"), 600.0),
        ("James", Date.valueOf("2021-01-08"), Date.valueOf("2021-01-01"), 600.0)
).toDF("name", "openday", "current_date", "salary")

标签: scalaapache-sparkapache-spark-sql

解决方案


因为我无法加入,因为名称列不明确,所以我只是与两个数据框执行了联合

val result_table = joined_table.groupBy("name").agg(max("openday").as("max_open_day"))
      .withColumnRenamed("name","name_max")
      .join(joined_table,col("name_max") === joined_table("name"),"inner").drop("name_max")
      .withColumn("diff",datediff(col("max_open_day"),col("openday"))).drop("max_open_day")

    result_table.show

这是我得到的结果。

+-----+----------+------------+------+----+
| name|   openday|current_date|salary|diff|
+-----+----------+------------+------+----+
|James|2021-07-22|  2021-01-01| 600.0|   0|
|James|2021-05-01|  2021-01-01| 600.0|  82|
|James|2021-01-05|  2021-01-01| 600.0| 198|
|James|2021-03-04|  2021-01-01| 600.0| 140|
|James|2021-02-12|  2021-01-01| 600.0| 160|
|James|2021-01-01|  2021-01-01| 600.0| 202|
|James|2021-01-02|  2021-01-01| 600.0| 201|
|James|2021-01-03|  2021-01-01| 600.0| 200|
|James|2021-01-07|  2021-01-01| 600.0| 196|
|James|2021-01-08|  2021-01-01| 600.0| 195|
+-----+----------+------------+------+----+

这是你所期待的吗?


推荐阅读