scala - 如何在子查询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")
解决方案
因为我无法加入,因为名称列不明确,所以我只是与两个数据框执行了联合
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|
+-----+----------+------------+------+----+
这是你所期待的吗?
推荐阅读
- postgresql - 从 Kubernetes 访问外部数据库
- django - Django 上下文未呈现
- python - 带有 ipywidgets 的 jupyter 中的按钮和文本框出现问题
- python - 如何让openCV在google colab上使用GPU
- pine-script - 寻找多时间范围内的警报
- node.js - 将 Nightmare.js 应用程序部署到 Heroku(Node.js + Telegraf)
- c++ - 如何在 vscode 中设置“包含路径”来编译 c++
- python - 选择索引的最大值(V查找表)
- c++ - 如何从“sockaddr_storage”实例中检索 IP 和端口?
- masstransit - 如何将 MassTransit 消息标头注入我的自定义类构造函数?