Spark Sql中的window函数
2017-05-21 本文已影响2396人
八刀一闪
** 简介 **
在使用spark sql的时候经常会计算一些汇聚特征,比如一个卖家在一段时间的销售总额,对于这种汇聚后返回单值的需求通过groupBy("xxx").agg(xxx)即可。
但是有些时候需要计算一些排序特征,窗口特征等,如一个店铺的首单特征。对于这样的特征显然是不能简单通过groupBy操作来完成,好在spark提供了window函数来完成类似的操作。
window函数对于DataFrame中的每一行都返回一个计算出的值,而groupBy则是对于一个group的key返回一个值。对于DataFrame中的每一行,WindowSpec指定了这行对应的一个WindowFrame,然后在这个WindowFrame上执行相关统计函数。
** 样例代码 **
val orders = Seq(
("o1", "s1", "2017-05-01", 100),
("o2", "s1", "2017-05-02", 200),
("o3", "s2", "2017-05-01", 300)
).toDF("order_id", "seller_id", "order_date", "price")
// 店铺订单顺序
val rankSpec = Window.partitionBy("seller_id").orderBy("pay_time")
val shopOrderRank =
orders.withColumn("rank", dense_rank.over(rankSpec))
// 店铺这个订单及前一单的价格和
val sumSpec = Window.partitionBy("seller_id").orderBy("pay_time")
.rowsBetween(-1, 0)
orders.withColumn("cumulative_sum", sum("price").over(sumSpec))
** 订单顺序 **
image.png
** 窗口累加 **
image.png
** 相关链接 **
https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html