zoukankan      html  css  js  c++  java
  • Hadoop Hive概念学习系列之hive的索引及案例(八)

    hive里的索引是什么?

      索引是标准的数据库技术,hive 0.7版本之后支持索引。Hive提供有限的索引功能,这不像传统的关系型数据库那样有“键(key)”的概念,用户可以在某些列上创建索引来加速某些操作,给一个表创建的索引数据被保存在另外的表中。 Hive的索引功能现在还相对较晚,提供的选项还较少。但是,索引被设计为可使用内置的可插拔的java代码来定制,用户可以扩展这个功能来满足自己的需求。 当然不是说有的查询都会受惠于Hive索引。用户可以使用EXPLAIN语法来分析HiveQL语句是否可以使用索引来提升用户查询的性能。像RDBMS中的索引一样,需要评估索引创建的是否合理,毕竟,索引需要更多的磁盘空间,并且创建维护索引也会有一定的代价。 用户必须要权衡从索引得到的好处和代价。

     Hive的索引目的是什么?

      Hive的索引目的是提高Hive表指定列的查询速度
      没有索引时,类似'WHERE tab1.col1 = 10' 的查询,Hive会加载整张表或分区,然后处理所有的rows。但是如果在字段col1上面存在索引时,那么只会加载和处理文件的一部分。与其他传统数据库一样,增加索引在提升查询速度时,会消耗额外资源去创建索引和需要更多的磁盘空间存储索引。
    Hive 0.7.0版本中,加入了索引。Hive 0.8.0版本中增加了bitmap索引。

      

    如何在hive里创建索引?

      说明:索引测试表是user,索引是user_index。

    步骤一:先创建索引测试表

    create table user(
    id int, 
    name string
    ) 
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '	'
    STORED AS TEXTFILE;

    步骤二:往索引测试表里导入数据

    LOAD DATA LOCAL INPATH '/export1/tmp/wyp/row.txt' OVERWRITE INTO TABLE user;

    步骤三:给索引测试表,创建索引之前测试

    SELECT * FROM user where id =500000;


    默认会去,加载整张表或分区,然后处理所有的rows。

    Total MapReduce jobs = 1
    Launching Job 1 out of 1

    .......

    Ended Job = job_1384246387966_0247
    MapReduce Jobs Launched:
    Job 0: Map: 2 Cumulative CPU: 5.63 sec
    HDFS Read: 361084006 HDFS Write: 357 SUCCESS
    Total MapReduce CPU Time Spent: 5 seconds 630 msec
    OK
    500000 wyp.
    Time taken: 14.107 seconds, Fetched: 1 row(s)

    可以看出,一共用了14.107s。

    步骤四:对索引测试表,创建索引,即这里是在表的属性id上,创建索引

    hive > CREATE INDEX user_index ON TABLE user(id)     //索引一定是建立在某个属性或某些属性上的
         > AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' 
         > WITH deferred REBUILD
         > IN TABLE user_index_table;

     或者

    CREATE INDEX user_index ON TABLE user(id) AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' WITH deferred REBUILD IN TABLE user_index_table;

      这样就对索引测试表user创建好了一个索引。索引名字为user_index。创建索引后的表命名为, user_index_table。

    步骤五: 填充索引测试表的索引数据

    ALTER INDEX user_index on user REBUILD;

    步骤六:查看下创建索引后的表的内容

    hive> SELECT * FROM user_index_table LIMIT 5; 

    0 hdfs://mycluster/user/hive/warehouse/table02/000000_0 [0]
    1 hdfs://mycluster/user/hive/warehouse/table02/000000_0 [352]
    2 hdfs://mycluster/user/hive/warehouse/table02/000000_0 [704]
    3 hdfs://mycluster/user/hive/warehouse/table02/000000_0 [1056]
    4 hdfs://mycluster/user/hive/warehouse/table02/000000_0 [1408]
    Time taken: 0.244 seconds, Fetched: 5 row(s)

    步骤七:对创建索引后的user再进行测试

    hive> select * from user where id =500000;

    在表user的字段id上面存在索引时,那么只会加载和处理文件的一部分。

    Total MapReduce jobs = 1
    Launching Job 1 out of 1

    ...

    MapReduce Total cumulative CPU time: 5 seconds 630 msec
    Ended Job = job_1384246387966_0247
    MapReduce Jobs Launched:
    Job 0: Map: 2 Cumulative CPU: 5.63 sec
    HDFS Read: 361084006 HDFS Write: 357 SUCCESS
    Total MapReduce CPU Time Spent: 5 seconds 630 msec
    OK
    500000 wyp.
    Time taken: 13.042 seconds, Fetched: 1 row(s)

      可以看出,明显加快了些。

    扩展

      若在Hive创建索引还存在bug:如果表格的模式信息来自SerDe,Hive将不能创建索引:

    hive> CREATE INDEX employees_index
    > ON TABLE employees (country)
    > AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
    > WITH DEFERRED REBUILD
    > IDXPROPERTIES ('creator' = 'me','created_at' = 'some_time')
    > IN TABLE employees_index_table
    > COMMENT 'Employees indexed by country and name.';

    FAILED: Error in metadata: java.lang.RuntimeException:
    Check the index columns, they should appear in the table being indexed.
    FAILED: Execution Error, return code 1 from
    org.apache.hadoop.hive.ql.exec.DDLTask

      这个bug发生在Hive0.10.0、0.10.1、0.11.0,在Hive0.12.0已经修复了,详情请参见:https://issues.apache.org/jira/browse/HIVE-4251

  • 相关阅读:
    年轻人的第一个 Spring Boot 应用,太爽了!
    面试问我 Java 逃逸分析,瞬间被秒杀了。。
    Spring Boot 配置文件 bootstrap vs application 到底有什么区别?
    坑爹的 Java 可变参数,把我整得够惨。。
    6月来了,Java还是第一!
    Eclipse 最常用的 10 组快捷键,个个牛逼!
    Spring Cloud Eureka 自我保护机制实战分析
    今天是 Java 诞生日,Java 24 岁了!
    厉害了,Dubbo 正式毕业!
    Spring Boot 2.1.5 正式发布,1.5.x 即将结束使命!
  • 原文地址:https://www.cnblogs.com/zlslch/p/6104090.html
Copyright © 2011-2022 走看看