基于日期和之前日期聚合 Spark 数据帧



我有一个数据帧start_date日期类型的列。现在,我必须为 column1 中唯一值生成指标,start_date之前或等于。 下面是一个输入数据帧

column1   column2  start_date
id1       val1     2018-03-12
id1       val2     2018-03-12
id2       val3     2018-03-12 
id3       val4     2018-03-12
id4       val5     2018-03-11
id4       val6     2018-03-11
id5       val7     2018-03-11
id5       val8     2018-03-11 
id6       val9     2018-03-10 

现在我必须转换为以下内容,

start_date     count
2018-03-12    6
2018-03-11    3
2018-03-10    1 

这就是我正在做的事情,这是没有效率的方式,

  1. 找出所有不同的start_dates并存储为列表
  2. 循环访问列表并为每个start_date生成输出
  3. 将所有输出合并到一个数据帧中。

有没有更好的方法可以在不循环的情况下做到这一点?

尝试如下操作 -

groupBy("start_date").agg(countdistinct("column1"))

在此模式中探索

检查计数不同 - https://spark.apache.org/docs/2.3.0/api/scala/index.html#org.apache.spark.sql.functions

使用火花窗口 - 例

val df = ... // schema => timestamp: TimestampType, stockId: StringType, price: DoubleType
df.groupBy(window($"time", "1 minute"), $"stockId")
.agg(mean("price"))

您可以将标准聚合与窗口函数结合使用,但第二阶段不会分发

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

df
.groupBy($"start_date")
.agg(approx_count_distinct($"column1").alias("count"))
.withColumn(
"cumulative_count", sum($"count").over(Window.orderBy($"start_date")))

最新更新