ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Hive索引

2021-11-03 23:05:51  阅读:188  来源: 互联网

标签:Index orc Hive 查询 索引 id


一、描述

  • Hive支持索引,但是Hive的索引与关系型数据库中的索引并不相同,比如,Hive不支持主键或者外键。
  • Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如减少Map Reduce任务中需要读取的数据块的数量。
  • 在可以预见到分区数据非常庞大的情况下,分桶和索引常常是优于分区的。而分桶由于SMB Join对关联键要求严格,所以并不是总能生效。

二、Hive原始索引

  • Hive的索引目的是提高Hive表指定列的查询速度。
  • 没有索引时,类似’WHERE tab1.col1 = 10’ 的查询,Hive会加载整张表或分区,然后处理所有的rows,但是如果在字段col1上面存在索引时,那么只会加载和处理文件的一部分。在每次建立、更新数据后,Hive索引不会自动更新,需要手动进行更新(重建索引以构建索引表),会触发一个mr job。
  • Hive索引使用过程繁杂,而且性能一般,在Hive3.0中已被删除,在工作环境中不推荐优先使用,在分区数量过多或查询字段不是分区字段时,索引可以作为补充方案同时使用。推荐使用ORC文件格式的索引类型进行查询。

三、Row Group Index

一个ORC文件包含一个或多个stripes(groups of row data),每个stripe中包含了每个column的min/max值的索引数据,当查询中有<,>,=的操作时,会根据min/max值,跳过扫描不包含的stripes。

  • 而其中为每个stripe建立的包含min/max值的索引,就称为Row Group Index行组索引,也叫min-max Index大小对比索引,或者Storage Index。

  • 在建立ORC格式表时,指定表参数’orc.create.index’=’true’之后,便会建立Row Group Index,需要注意的是,为了使Row Group Index有效利用,向表中加载数据时,必须对需要使用索引的字段进行排序,否则,min/max会失去意义。另外,这种索引主要用于 数值型字段的查询过滤优化上。

  • 设置 hive.optimize.index.filter为true,并重启hive

  • 创建表/插入数据

    create table lxw1234_orc2 stored as orc
    tblproperties (
        'orc.compress'='SNAPPY',
        -- 开启行组索引
        'orc.create.index'='true'
        )
    as
        select cast(siteid as int) as id,
               pcid
    from lxw1234_text
    -- 插入的数据保持排序
    distribute by id sort by id;
    
  • 查询

    set hive.optimize.index.filter=true;
    select count(1) from lxw1234_orc1 where id >= 1382 and id <= 1399;
    

四、Bloom Filter Index

  • 在建表时候,通过表参数”orc.bloom.filter.columns”=”pcid”来指定为那些字段建立BloomFilter索引,这样,在生成数据的时候,会在每个stripe中,为该字段建立BloomFilter的数据结构,当查询条件中包含对该字段的 = 号过滤时候,先从BloomFilter中获取以下是否包含该值,如果不包含,则跳过该stripe。

  • 创建

    create table lxw1234_orc2 stored as orc
    tblproperties (
        'orc.compress'='SNAPPY',
        'orc.create.index'='true',
        -- pcid字段开启BloomFilter索引
        'orc.bloom.filter.columns'='pcid'
        )
    as
        select cast(siteid as int) as id,
               pcid
    from lxw1234_text
    distribute by id
    sort by id;
    
  • 查询

    set hive.optimize.index.filter=true;
    select
           count(1)
    from
         lxw1234_orc1
    where
          id >= 0 
      and 
          id <= 1000
    and pcid in ('00005E25F0CDD', 'A');
    

标签:Index,orc,Hive,查询,索引,id
来源: https://blog.csdn.net/feizuiku0116/article/details/121132800

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有