【问题标题】:Add new column in the window function in spark在火花的窗口函数中添加新列
【发布时间】:2020-08-13 01:48:02
【问题描述】:

将一小时分成 15 分钟,为每 15 分钟的时间范围和相应的总和添加新列。

这里我使用了窗口函数:How to group by time interval in Spark SQL, 有人可以帮助如何添加 hour_part 列或除窗口函数之外的任何方法。

输入:

id,datetime,quantity
1234,2018-01-01 12:00:21,10
1234,2018-01-01 12:01:02,20
1234,2018-01-01 12:10:23,10
1234,2018-01-01 12:20:19,25
1234,2018-01-01 12:25:20,25
1234,2018-01-01 12:28:00,25
1234,2018-01-01 12:47:25,10
1234,2018-01-01 12:58:00,40

输出:

id,date,hour_part,sum
1234,2018-01-01,1,40
1234,2018-01-01,2,75
1234,2018-01-01,3,0
1234,2018-01-01,4,50

【问题讨论】:

  • 1234,2018-01-01,3,0 我确实调查了这个选项,作为窗口函数结果的一部分启用。

标签: scala apache-spark pyspark


【解决方案1】:

以下代码可能有助于您增加小时数,但 AFAIK 窗口函数可以有效解决运行聚合的问题。

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._

val df=Seq(("1234","2018-01-01 12:00:21",10),
("1234","2018-01-01 12:01:02",20),
("1234","2018-01-01 12:10:23",10),
("1234","2018-01-01 12:20:19",25),
("1234","2018-01-01 12:25:20",25),
("1234","2018-01-01 12:28:00",25),
("1234","2018-01-01 12:47:25",10),
("1234","2018-01-01 12:58:00",40)).toDF("id","datetime","quantity")

val windowSpec  = Window.partitionBy(lit("A")).orderBy(lit("A"))

df.groupBy($"id", window($"datetime", "15 minutes")).sum("quantity").orderBy("window")
.withColumn("hour_part",row_number.over(windowSpec))
.withColumn("date",to_date($"window.end")).withColumn("sum",$"sum(quantity)")
.drop($"window").drop($"sum(quantity)").show()

/*
+----+---------+----------+---+
|  id|hour_part|      date|sum|
+----+---------+----------+---+
|1234|        1|2018-01-01| 40|
|1234|        2|2018-01-01| 75|
|1234|        3|2018-01-01| 50|
+----+---------+----------+---+
*/

【讨论】:

    猜你喜欢
    • 2018-01-16
    • 2021-01-08
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2017-05-28
    • 2014-08-21
    相关资源
    最近更新 更多