大数据精进之路

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

上一篇下一篇

猜你喜欢

热点阅读