一种哈希连接的方法及装置的制造方法

文档序号:9432701阅读:289来源:国知局
一种哈希连接的方法及装置的制造方法
【技术领域】
[0001 ] 本发明涉及计算机技术领域,特别涉及一种哈希连接的方法及装置。
【背景技术】
[0002]Spark是一个基于内存计算的开源的集群计算系统,目的是让数据分析更加快速。Spark非常小巧玲珑,由加州伯克利大学AMP实验室的Matei为主的小团队所开发。使用的语言是Scala,虽然Spark与Hadoop有相似之处,但它提供了具有有用差异的一个新的集群计算框架。首先,Spark是为集群计算中的特定类型的工作负载而设计,即那些在并行操作之间重用工作数据集(比如机器学习算法)的工作负载。为了优化这些类型的工作负载,Spark引进了内存集群计算的概念,可在内存集群计算中将数据集缓存在内存中,以缩短访问延迟。
[0003]在hadoop 发展过程中,为了 给熟悉 RDBMS (Relat1nal Database ManagementSystem,关系数据库管理系统)但又不理解MapReduce的技术人员提供快速上手的工具,hive应运而生,是当时唯一运行在hadoop上的SQL-on-Hadoop工具。但是,MapReduce计算过程中大量的中间磁盘落地过程消耗了大量的1/0,降低的运行效率,为了提高SQL-on-Hadoop 的效率,大量的 SQL-on-Hadoop 工具开始产生,MapR 的 Drill、Cloudera 的Impala、Shark都是在这一背景下产生的工具,其中Shark是伯克利实验室spark生态环境的组件之一,它修改了下图所示的右下角的内存管理、物理计划、执行三个模块,并使之能运行在spark引擎上,从而使得SQL查询的速度得到10-100倍的提升。
[0004]随着Spark的发展,Shark对于hive的太多依赖(如采用hive的语法解析器、查询优化器等等),制约了 spark各个组件的相互集成,所以提出了 sparkSQL项目。SparkSQL抛弃原有Shark的代码,汲取了 Shark的一些优点,如内存列存储(In-Memory ColumnarStorage)、Hive兼容性等,重新开发了 SparkSQL代码,由于摆脱了对hive的依赖性,SparkSQL无论在数据兼容、性能优化、组件扩展方面都得到了极大的方便。
[0005]Hive中join操作主要有map join和reduce join组成,这两种join操作均使用的是mapreduce的计算架构,sparksql上的join操作针对mapreduce架构内存利用不足的问题提出了自己的计算模型。现有的hash join(哈希连接)操作中,将整个需要实现join操作的数据表存储到内存中进行hash join,无法利用现有空闲的内存,只能利用较大的内存进行处理,join效率较低。

【发明内容】

[0006]有鉴于此,本发明提供了一种哈希连接的方法及装置,能够提高join效率。
[0007]—方面,本发明提供了一种哈希连接的方法,包括:
[0008]S1:获取待操作的第一表中待操作的第一数据和待操作的第二表中待操作的第二数据;
[0009]S2:计算每个第一数据的哈希值,根据每个第一数据的哈希值,确定每个第一数据对应的分区号,并计算每个第二数据的哈希值,根据每个第二数据的哈希值,确定每个第二数据对应的分区号;
[0010]S3:将对应相同分区号的数据读入到内存的同一个分区中;
[0011]S4:分别将同一个分区中的第一数据和第二数据进行哈希连接hash join操作。
[0012]进一步地,该方法还包括:
[0013]实时检测所述内存的剩余量是否小于等于预设值,如果是,则将所述内存的任一分区中的未进行hash join操作的第一数据和/或第二数据移出内存,否则,将从内存中移出的未进行hash join操作的数据读入到所述内存中。
[0014]进一步地,所述S2中,所述根据每个第一数据的哈希值,确定每个第一数据对应的分区号,包括:
[0015]根据公式一确定每个第一数据对应的分区号,其中,公式一为:
[0016]numl = a | mod length ;
[0017]其中,numl是第一数据对应的分区号,a为第一数据的哈希值,length为预设的内存中分区的数量;
[0018]所述S2中,所述根据每个第二数据的哈希值,确定每个第二数据对应的分区号,包括:
[0019]根据公式二确定每个第二数据对应的分区号,其中,公式二为:
[0020]num2 = b | mod length ;
[0021]其中,nUm2是第二数据对应的分区号,b为第二数据的哈希值,length为预设的内存中分区的数量。
[0022]进一步地,在所述SI之前,还包括:
[0023]Dl:分别在存储所述第一表的第一磁盘中和存储所述第二表的第二磁盘中,划分出哈希桶,为每个哈希桶分配哈希桶号;
[0024]D2:计算每个第一数据的哈希值,根据每个第一数据的哈希值,确定每个第一数据对应的哈希桶号,并计算每个第二数据的哈希值,根据每个第二数据的哈希值,确定每个第二数据对应的哈希桶号;
[0025]D3:根据每个第一数据对应的哈希桶号,将每个第一数据存储在所述第一磁盘中的具有相同哈希桶号的哈希桶中,并根据每个第二数据对应的哈希桶号,将每个第二数据存储在所述第二磁盘中的具有相同哈希桶号的哈希桶中;
[0026]所述SI,包括:
[0027]分别从第一磁盘和第二磁盘中的具有相同哈希桶号的哈希桶中获取所述第一数据和所述第二数据。
[0028]进一步地,所述S4,包括:
[0029]为每个分区分配hash join操作线程,通过每个分区对应的所述hash join操作线程,将每个分区中的第一数据和第二数据进行hash join操作。
[0030]另一方面,本发明提供了一种哈希连接的装置,包括:
[0031]获取单元,用于获取待操作的第一表中待操作的第一数据和待操作的第二表中待操作的第二数据;
[0032]分区号确定单元,用于计算每个第一数据的哈希值,根据每个第一数据的哈希值,确定每个第一数据对应的分区号,并计算每个第二数据的哈希值,根据每个第二数据的哈希值,确定每个第二数据对应的分区号;
[0033]读入单元,用于将对应相同分区号的数据读入到内存的同一个分区中;
[0034]操作单元,用于分别将同一个分区中的第一数据和第二数据进行哈希连接hashjoin操作。
[0035]进一步地,该装置还包括:
[0036]检测单元,用于实时检测所述内存的剩余量是否小于等于预设值,如果是,则将所述内存的任一分区中的未进行hash join操作的第一数据和/或第二数据移出内存,否则,将从内存中移出的未进行hash join操作的数据读入到所述内存中。
[0037]进一步地,所述分区号确定单元,在执行所述根据每个第一数据的哈希值,确定每个第一数据对应的分区号时,具体执行:根据公式一确定每个第一数据对应的分区号,其中,公式一为:
[0038]numl = a | mod length ;
[0039]其中,numl是第一数据对应的分区号,a为第一数据的哈希值,length为预设的内存中分区的数量;
[0040]所述分区号确定单元,在执行根据每个第二数据的哈希值,确定每个第二数据对应的分区号时,具体执行:
[0041]根据公式二确定每个第二数据对应的分区号,其中,公式二为:
[0042]num2 = b | mod length ;
[0043]其中,nUm2是第二数据对应的分区号,b为第二数据的哈希值,length为预设的内存中分区的数量。
[0044]进一步地,该装置还包括:
[0045]分桶单元,用于分别在存储所述第一表的第一磁盘中和存储所述第二表的第二磁盘中,划分出哈希桶,为每个哈希桶分配哈希桶号;
[0046]桶号确定单元,用于计算每个第一数据的哈希值,根据每个第一数据的哈希值,确定每个第一数据对应的哈希桶号,并计算每个第二数据的哈希值,根据每个第二数据的哈希值,确定每个第二数据对应的哈希桶号;
[0047]存储单元,用于根据每个第一数据对应的哈希桶号,将每个第一数据存储在所述第一磁盘中的具有相同哈希桶号的哈希桶中,并根据每个第二数据对应的哈希桶号,将每个第二数据存储在所述第二磁盘中的具有相同哈希桶号的哈希桶中;
[0048]所述获取单元,用于分别从第一磁盘和第二磁盘中的具有相同哈希桶号的哈希桶中获取所述第一数据和所述第二数据。
[0049]进一步地,所述操作单元,用于为每个分区分配hash join操作线程,通过每个分区对应的所述hash join操作线程,将每个分区中的第一数据和第二数据进行hash join操作。
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1