加入收藏 | 设为首页 | 会员中心 | 我要投稿 宜春站长网 (https://www.0795zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 传媒 > 正文

中国值得期待的十大人工智能公司

发布时间:2021-02-20 18:23:49 所属栏目:传媒 来源:互联网
导读:注意:可用的汇总函数为最大,最小,总和,平均和计数。 窗口排名功能 在本节中,我们将讨论几种类型的排名函数。 创建用于排序功能的窗口规范 现在,我们要根据员工在部门内的薪水进行排名。 薪水最高的员工将排名第一,薪水最低的员工将排名最后。 在这里

注意:可用的汇总函数为最大,最小,总和,平均和计数。

窗口排名功能

在本节中,我们将讨论几种类型的排名函数。

创建用于排序功能的窗口规范

现在,我们要根据员工在部门内的薪水进行排名。 薪水最高的员工将排名第一,薪水最低的员工将排名最后。 在这里,我们将基于部门(列:depname)对数据进行分区,并且在部门内,我们将根据薪水以降序对数据进行排序。


 

在此博客文章中,我们将深入探讨Apache Spark窗口函数。 您可能也对我之前有关Apache Spark的帖子感兴趣。

  • 使用Apache Spark开始您的旅程-第1部分
  • 使用Apache Spark开始您的旅程-第2部分
  • Apache Spark开始您的旅程-第3部分
  • 深入研究Apache Spark DateTime函数
  • 在Apache Spark中使用JSON

首先,让我们看看什么是窗口函数以及何时使用它们。 我们在Apache Spark中使用了各种功能,例如月份(从日期返回月份),四舍五入(舍入值)和地板(为给定的输入提供底值)等,这些功能将在每条记录上执行并返回一个值 每条记录。 然后,我们将对一组数据执行各种聚合函数,并为每个组返回一个值,例如sum,avg,min,max和count。 但是,如果我们想对一组数据执行该操作,并且希望对每个记录有一个单一的值/结果怎么办? 在这种情况下,我们可以使用窗口函数。 他们可以定义记录的排名,累积分布,移动平均值,或标识当前记录之前或之后的记录。

让我们使用一些Scala API示例来了解以下窗口函数:

  • 汇总:min, max, avg, count, 和 sum.
  • 排名:rank,dense_rank,percent_rank,row_num和ntile
  • 分析性:cume_dist,lag和lead
  • 自定义边界:rangeBetween和rowsBetween

为便于参考,GitHub上提供了一个以JSON文件格式导出的Zeppelin笔记本和一个Scala文件。

创建Spark DataFrame

现在,我们创建一个示例Spark DataFrame,我们将在整个博客中使用它。 首先,让我们加载所需的库。


 

这里的 keys 与 values 字段就是存储 key 和 value 的真正内存的地方,我们可以看到这里每个都是长度为8的数组,也就是说一个桶内存了两个数组,一个存的是 key 列表,另一个是 value 列表,并且每个数据的大小都是8。那么当有第9个元素入桶时,我们就需要创建新的桶了,也就是 overflow 字段指向一个新的 bucket(bmap 结构)。

还有一个字段就是 topbits,也是一个长度为8的数组,其实看到这里我们应该想到,这三个数组长度都相同应该有对应关系了,也就是说 topbits 数组中第一个元素是一个8位大小,我们称之为 高8位,这是我们再回想一下哈希函数,我们的哈希函数的结果取高8位,然后存入 topbits 数组,然后其在数组的索引我们称之为i,那么我们就可以在 keys 和 values 数组的第i个位置存储数据了。

上面是在已知一个桶中添加或者修改元素,那么我们该如何查找这个桶呢?

我们知道在 hmap 中有 buckets 字段,其指向 []bmap 数组。那么我们就需要通过 key 找到对应的 bmap 在 []bmap 中的位置。关于此处的计算大家感兴趣的可以看一下源码,这里就不详细说每一个运算符都是怎么运算的,只说一下大致的流程:hmap 中有一个 B 字段,根据字段 B 的值,以及 key 的 hash 值,计算出目标桶在 []bmap 中的位置(其实就是取了 key 的哈希的后几位作为数组的下标即可)。

现在我们根据一个 key 可以在 hmap 中的 buckets 字段找到对应的 bmap 对象,同时在 bmap 中根据 key 哈希的高八位找到其在 keys 与 values 数组中的位置。这里我们还没有说如果有 overflow 的情况。其实不说想必大家也能猜到了,在我们定位到一个 bmap 时,是不知道其一共有多少个溢出桶的:假设我们有桶 A,A 的 overflow 字段指向桶 B,B 的 overflow 指向桶 C,假设我们此时根据 key 的哈希找到了桶 A,然后 for 循环遍历桶中的 topbits 数组,如果某个高8位的哈希与我们想找的 key 的哈希的高8位相同,就去对应位置的 keys 数组查找对应的 key1,假如 key1 与我们的目标 key 相等,那么直接返回其对应 values 数组中的 value 即可。如果key1 与我们的目标 key 不相等,接着变量桶中其他元素。假设桶中所有元素遍历后没有找到相同的 key,那么此时就要到 A 桶的溢出桶 B 再去遍历,如果 B 中依然找不到再去桶 C 中查找。此时大家可以思考一下如果是你,你会如何实现这部分代码呢?你实现的和 Go 的源码是否一样呢?

当我们知道了上面定位 key 的过程,对于 key 的增删改查过程也就不多说了,因为核心的我们已经掌握了,现在大家可以去看一下源码了,这时大家看源码必定事半功倍。


(编辑:宜春站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读