在大数据分析中,窗口函数最常见的应用场景就是对数据进行分组后,求组内数据topN的需求,如果没有窗口函数,实现这样一个需求还是比较复杂的,不过现在大多数标准 SQL 中都支持这样的功能,今天我们就来学习下如何在spark sql使用窗口函数来完成一个分组求TopN的需求。
思路分析:
在spark sql中有两种方式可以实现:
(1)使用纯spark sql的方式。
(2)spark的编程api来实现。
虽然有两种形式,但底层原理都一样,借助了spark里面的window算子,我们先来看下纯sql的实现方式,其代码如下:
我们来看下输出结果如下:
注意这里,我为了保持整洁,没有使用嵌套的子查询,而是在s3处,又过滤了一下结果。 我们看到,在sql中我们借助使用了rank函数,因为id=1的,最新日期有两个一样的,所以rank相等, 故最终结果返回了三条数据,到这里有的朋友可能就有疑问了,我只想对每组数据取topN,比如每组只取一条应该怎么控制,现在某组可能会返回2条,虽然意义上没错,但总觉得不太好,那么能不能实现呢?
答案是可以的,这就涉及到关于排名函数的介绍,我们这里只介绍常用的三种,分别是:
(1)rank
(2)row_number
(3)dense_rank
这次,我们用代码实现上面的需求,并观察上面上个函数生成rank值的区别,代码如下:
ok,我们看下输出结果:
注意看输出数据的前三行,观察后面的值,我们能够发现上面三个函数的区别是:
(1)rank (生成rank值可以重复但不一定连续)
(2)row_number (生成rank值可以重复但是连续)
(3)dense_rank (生成的rank值不重复但是连续)
了解上面的区别后,我们再回到刚才的那个问题,如何取Top1的时候,每组只返回一条数据?
答案就是使用row_number进行过滤,如下,对上面的代码稍加改造即可:
结果如下:
在sql里面也一样,只要把rank函数换成row_number函数即可,这里就不在演示了,感兴趣的同学可以自己尝试下。
在spark的窗口函数里面,上面的应用场景属于比较常见的case,当然spark窗口函数的功能要比上面介绍的要丰富的多,这里就不在介绍了,想学习的同学可以参考下面的这个链接:
https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html
以上所述就是小编给大家介绍的《如何在 Spark 里面使用窗口函数》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Go中函数、匿名函数和递归的使用
- Java 8函数式编程模式:不要使用匿名函数
- 015.Python函数名的使用以及函数变量的操作
- c++中transform()函数和find()函数的使用方法。
- Axure函数使用手册
- 高阶函数的使用
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Beginning Google Maps API 3
Gabriel Svennerberg / Apress / 2010-07-27 / $39.99
This book is about the next generation of the Google Maps API. It will provide the reader with the skills and knowledge necessary to incorporate Google Maps v3 on web pages in both desktop and mobile ......一起来看看 《Beginning Google Maps API 3》 这本书的介绍吧!