一种SparkBroadcasthashjoin操作的改进方法与流程

文档序号:11251015阅读:580来源:国知局
一种Spark Broadcasthashjoin操作的改进方法与流程

本发明涉及spark大数据处理技术领域,特别是涉及一种sparkbroadcasthashjoin操作的改进方法。



背景技术:

目前,spark是近年来发展较快的分布式并行大数据处理框架,sparksql提供了对结构化数据的处理。broadcasthashjoin是sparksql中的一项重要操作,用于处理多表连接。broadcasthashjoin是对join操作的优化处理。

在sparksql中broadcasthashjoin首先使用broadcast把小表分发到每台执行节点上,然后利用小表中的key数据计算hash值建立哈希表,最后计算大表对应的hash值,在hash表中进行查找最终完成表的连接。broadcasthashjoin操作过程中需要利用小表来创建哈希表,创建哈希表的过程中不可避免的要解决相同key的冲突问题,broadcasthashjoin操作中用链地址法来解决冲突。然而这种方法再处理冲突时,往往不会考虑小表中数据被大表查找的先验概率大小。例如,小表中key值a位于key值b之前,二者对应的哈希值相同,在创建哈希表时利用链地址法处理冲突会将b链接在a之后,而实际先验已知在大表中进行查找连接操作时,查找b的频率远远高于a,那么此时查找效率将会非常低下,尤其是在处理大批相同哈希值的情况下。

在spark集群中直接join将会对所有数据进行shuffle,需要大量的io操作,相同的key会在同一个partition中进行处理,任务的并发度也受到了限制。broadcasthashjoin通过使用broadcast把小表分发到每台执行节点上,从而使得关联操作都在本地完成,基本就取消了shuffle的过程,运行效率大幅度提高。然而该操作同时也涉及到哈希表的创建和查找过程,以及哈希表创建过程中的冲突解决问题。broadcasthashjoin利用链地址法来解决冲突。然而这种方法处理冲突时只是在每次遇到冲突时将对应数据依次挂接在相同hash值对应的链表里,并未考虑到小表中数据被大表查找的先验概率大小,也即大表中与小表中相同字段的概率大小,从而造成了后续大表join操作时查找连接效率较低。



技术实现要素:

本发明的目的是提供一种sparkbroadcasthashjoin操作的改进方法,以实现提高查找效率,进而提高join的连接效率。

为解决上述技术问题,本发明提供一种sparkbroadcasthashjoin操作的改进方法,该方法包括:

获取小表,并获取小表中key值被大表查找的先验概率;

依据先验概率对小表中的key从大到小进行排序,得到一个新的有序表;

利用所述新的有序表构建哈希表,将哈希表广播到各个节点;

在各个节点获取大表内容,将大表内容与哈希表中的匹配项进行连接。

优选的,小表中的每个key均对应一个先验概率。

优选的,所述利用所述新的有序表构建哈希表,包括:

逐行计算小表中每行key的哈希值,将具有相同哈希值的key对应的关键字都依次放在同一个链表中,构成哈希表。

优选的,所述哈希值为关键字的哈希地址。

优选的,所述将具有相同哈希值的key对应的关键字都依次放在同一个链表中,构成哈希表之后,还包括:采用数组存放各个链表的头指针。

优选的,链表的数目和哈希地址的数目相同。

优选的,所述将大表内容与哈希表中的匹配项进行连接,包括:

计算大表中各行key的哈希值,在哈希表中查找哈希值相同的匹配项,将大表内容与匹配项进行连接。

本发明所提供的一种sparkbroadcasthashjoin操作的改进方法,获取小表,并获取小表中key值被大表查找的先验概率;依据先验概率对小表中的key从大到小进行排序,得到一个新的有序表;利用所述新的有序表构建哈希表,将哈希表广播到各个节点;在各个节点获取大表内容,将大表内容与哈希表中的匹配项进行连接。可见,该方法改进了broadcasthashjoin操作,增加了小表中key值被大表查找的先验概率,小表中每个key均对应一个先验被查找概率,在利用小表数据构建哈希表时首先按照该先验概率对key从小到大进行排序,排序后得到一个新的有序表,然后再对新的有序表进行常规的哈希表构建过程。由于用于构建哈希表的小表中每个key被查找的概率不同,按被查找的先验概率大小来决定其冲突处理时的位置,将出现概率大的放在所需比较次数少的位置,从而减少后续大表查找连接操作时的查找次数,提高查找效率,提高broadcasthashjoin的整体性能。并且将小表中数据元素被大表查找的先验概率作为建立哈希表时插入顺序的依据,使得查找连接过程与原操作相比在不增加过多其它消耗的同时降低了冲突时执行查询的查找长度,从而使查询响应时间更短,进而join的连接效率更高,提高join的连接效率。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。

图1为本发明所提供的一种sparkbroadcasthashjoin操作的改进方法的流程图;

图2为现有技术中的sparkbroadcasthashjoin实现流程图;

图3为本发明改进的sparkbroadcasthashjoin实现流程图;

图4为改进前后哈希表示意图。

具体实施方式

本发明的核心是提供一种sparkbroadcasthashjoin操作的改进方法,以实现提高查找效率,进而提高join的连接效率。

为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

请参考图1,图1为本发明所提供的一种sparkbroadcasthashjoin操作的改进方法的流程图,该方法包括:

s11:获取小表,并获取小表中key值被大表查找的先验概率;

s12:依据先验概率对小表中的key从大到小进行排序,得到一个新的有序表;

s13:利用所述新的有序表构建哈希表,将哈希表广播到各个节点;

s14:在各个节点获取大表内容,将大表内容与哈希表中的匹配项进行连接。

可见,该方法改进了broadcasthashjoin操作,增加了小表中key值被大表查找的先验概率,小表中每个key均对应一个先验被查找概率,在利用小表数据构建哈希表时首先按照该先验概率对key从小到大进行排序,排序后得到一个新的有序表,然后再对新的有序表进行常规的哈希表构建过程。由于用于构建哈希表的小表中每个key被查找的概率不同,按被查找的先验概率大小来决定其冲突处理时的位置,将出现概率大的放在所需比较次数少的位置,从而减少后续大表查找连接操作时的查找次数,提高查找效率,提高broadcasthashjoin的整体性能。

并且将小表中数据元素被大表查找的先验概率作为建立哈希表时插入顺序的依据,使得查找连接过程与原操作相比在不增加过多其它消耗的同时降低了冲突时执行查询的查找长度,从而使查询响应时间更短,进而join的连接效率更高,提高join的连接效率。

基于上述方法,具体的,小表中的每个key均对应一个先验概率。

进一步的,步骤s13中,利用所述新的有序表构建哈希表的过程具体为:逐行计算小表中每行key的哈希值,将具有相同哈希值的key对应的关键字都依次放在同一个链表中,构成哈希表。

其中,所述哈希值为关键字的哈希地址。

进一步的,将具有相同哈希值的key对应的关键字都依次放在同一个链表中,构成哈希表之后,还包括:采用数组存放各个链表的头指针。

其中,链表的数目和哈希地址的数目相同。

进一步的,步骤s14中,将大表内容与哈希表中的匹配项进行连接的内容具体为:计算大表中各行key的哈希值,在哈希表中查找哈希值相同的匹配项,将大表内容与匹配项进行连接主要技术特征:

详细的,传统的sparkbroadcasthashjoin实现流程如图2所示,具体的步骤为:(1)获取小表t1;(2)构建哈希表:逐行计算小表中每行key的哈希值,把具有相同哈希地址的关键字都依次放在同一个链表中,有m个哈希地址就有m个链表。同时,用数组a[0..m-1]存放各个链表的头指针,凡是哈希地址为i的记录都以节点方式插入到以a[i]为头节点的链表中;(3)将哈希表广播到各个计算节点;(4)在各节点获取大表内容,计算大表各行key的哈希值,在哈希表中查找匹配;(5)将大表内容与找到的匹配项进行连接并返回。

本方法是在小表中增加各key被查找的先验概率,在构建哈希表之前加入对小表按照先验概率进行排序的步骤,以此来调整后续构建哈希表时小表中各键值在哈希表中的位置,从而达到尽量减少大表查找次数,提高整体连接效率的目的。本发明改进后的broadcasthashjoin操作实现如图3所示,具体实现步骤为:(1)获取小表t1;(2)按照先验概率大小对小表按照从大到小的顺序进行排序;(3)构建哈希表:逐行计算小表中每行key的哈希值,把具有相同哈希地址的关键字都依次放在同一个链表中,有m个哈希地址就有m个链表。同时,用数组a[0..m-1]存放各个链表的头指针,凡是哈希地址为i的记录都以节点方式插入到以a[i]为头节点的链表中;(4)将哈希表广播到各个计算节点;(5)在各节点获取大表内容,计算大表各行key的哈希值,在哈希表中查找匹配;(6)将大表内容与找到的匹配项进行连接并返回。

本方法对broadcasthashjoin操作进行改进,通过增加小表中key值被查找的先验概率来改变链地址法处理冲突的规则,从而提高spark中多表连接的效率。其中,改进的broadcasthashjoin操作,增加了小表中key值被大表查找的先验概率,小表中每个key均对应一个先验被查找概率。在利用小表数据构建哈希表时首先按照该先验概率对key从小到大进行排序,排序后得到一个新的有序表,然后再对新的有序表进行常规的哈希表构建过程。由于用于构建哈希表的小表中每个key被查找的概率不同,按被查找的先验概率大小来决定其冲突处理时的位置,将出现概率大的放在所需比较次数少的位置,从而减少后续大表查找连接操作时的查找次数,提高broadcasthashjoin的整体性能。

例如,在小表中存在key(b)键和key(c)键,且二者的对应的哈希地址相等即h(key(b))=h(key(c)),在小表中key(b)位于key(c)之前,但key(b)的被查找的概率要远小于key(c)。本方法首先按照先验概率大小排序得到新表,排序后key(c)在新表中的位置要位于key(b)之前。然后按新表创建哈希表,此时在h(key(b))(或h(key(c)))位置对应的链表中key(c)位于key(b)之前。最后获取大表内容在哈希表中进行查找并连接,此时key(c)的查找长度减少而key(b)的查找长度增加,但由于在大表中key(c)出现的概率要远大于key(b),所以整体查找效率提高。对于该简例,改进前后key(b)与key(c)在哈希表中的位置如图4所示,图4中箭头左边的图为改进前的哈希表,箭头右边改进后的哈希表。

综上所述,本方法将数据元素被查找的先验概率作为建立哈希表时插入顺序的依据,查找过程与原哈希表相比在不增加其它过多消耗的同时降低了冲突时执行查询的查找长度,从而使查询响应时间更短,join的连接效率更高。

以上对本发明所提供的一种sparkbroadcasthashjoin操作的改进方法进行了详细介绍。本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1