我有一个数据帧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
这就是我正在做的事情,这是没有效率的方式,
- 找出所有不同的start_dates并存储为列表
- 循环访问列表并为每个start_date生成输出
- 将所有输出合并到一个数据帧中。
有没有更好的方法可以在不循环的情况下做到这一点?
尝试如下操作 -
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")))