如何在 Spark 里面使用窗口函数

栏目: 编程工具 · 发布时间: 6年前

如何在 Spark 里面使用窗口函数

在大数据分析中,窗口函数最常见的应用场景就是对数据进行分组后,求组内数据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 里面使用窗口函数》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机科学概论(第11版)

计算机科学概论(第11版)

J. Glenn Brookshear / 刘艺、肖成海、马小会、毛倩倩 / 人民邮电出版社 / 2011-10-1 / 69.00元

本书多年来一直深受世界各国高校师生的欢迎,是美国哈佛大学、麻省理工学院、普林斯顿大学、加州大学伯克利分校等许多著名大学的首选教材,对我国的高校教学也产生了广泛影响。 本 书以历史眼光,从发展的角度、当前的水平以及现阶段的研究方向等几个方面,全景式描绘了计算机科学各个子学科的主要领域。在内容编排上,本书很好地兼顾了 学科广度和主题深度,把握了最新的技术趋势。本书用算法、数据抽象等核心思想贯穿各......一起来看看 《计算机科学概论(第11版)》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具