Scala 计算不断增加的日期序列
我在Spark中有一个带有名称列和日期的数据框。我想为每个名字找到所有连续不断增加的日期序列(日复一日),并计算它们的持续时间。输出应包含名称、开始日期(日期序列)和该时间段的持续时间(天数) 如何使用Spark函数实现此功能 连续的日期序列示例:Scala 计算不断增加的日期序列,scala,date,apache-spark,apache-spark-sql,Scala,Date,Apache Spark,Apache Spark Sql,我在Spark中有一个带有名称列和日期的数据框。我想为每个名字找到所有连续不断增加的日期序列(日复一日),并计算它们的持续时间。输出应包含名称、开始日期(日期序列)和该时间段的持续时间(天数) 如何使用Spark函数实现此功能 连续的日期序列示例: 2019-03-12 2019-03-13 2019-03-14 2019-03-15 我已经定义了这样的解决方案,但它根据每个名称计算总天数,而不是将其划分为序列: val result = allDataDf .groupBy($"na
2019-03-12
2019-03-13
2019-03-14
2019-03-15
我已经定义了这样的解决方案,但它根据每个名称计算总天数,而不是将其划分为序列:
val result = allDataDf
.groupBy($"name")
.agg(count($"date").as("timePeriod"))
.orderBy($"timePeriod".desc)
.head()
此外,我尝试了使用秩,但计数列只有1,出于某些原因:
val names = Window
.partitionBy($"name")
.orderBy($"date")
val result = allDataDf
.select($"name", $"date", rank over names as "rank")
.groupBy($"name", $"date", $"rank")
.agg(count($"*") as "count")
输出如下所示:
+-----------+----------+----+-----+
|stationName| date|rank|count|
+-----------+----------+----+-----+
| NAME|2019-03-24| 1| 1|
| NAME|2019-03-25| 2| 1|
| NAME|2019-03-27| 3| 1|
| NAME|2019-03-28| 4| 1|
| NAME|2019-01-29| 5| 1|
| NAME|2019-03-30| 6| 1|
| NAME|2019-03-31| 7| 1|
| NAME|2019-04-02| 8| 1|
| NAME|2019-04-05| 9| 1|
| NAME|2019-04-07| 10| 1|
+-----------+----------+----+-----+
在SQL中查找连续日期相当容易。您可以使用以下查询来完成此操作:
WITH s AS (
SELECT
stationName,
date,
date_add(date, -(row_number() over (partition by stationName order by date))) as discriminator
FROM stations
)
SELECT
stationName,
MIN(date) as start,
COUNT(1) AS duration
FROM s GROUP BY stationName, discriminator
幸运的是,我们可以在spark中使用SQL。让我们看看它是否有效(我使用了不同的日期):
它似乎输出了正确的数据集:
+-----------+----------+--------+
|stationName| start|duration|
+-----------+----------+--------+
| NAME1|2019-03-22| 4|
| NAME1|2019-03-27| 2|
| NAME2|2019-03-27| 2|
| NAME2|2019-03-30| 2|
| NAME2|2019-04-04| 3|
+-----------+----------+--------+
可能的重复需要更好的解释你能举例说明输入和输出表应该是什么样子吗?
+-----------+----------+--------+
|stationName| start|duration|
+-----------+----------+--------+
| NAME1|2019-03-22| 4|
| NAME1|2019-03-27| 2|
| NAME2|2019-03-27| 2|
| NAME2|2019-03-30| 2|
| NAME2|2019-04-04| 3|
+-----------+----------+--------+