• Hive


    hive版本:0.9.0

    数据存储及解析

    我们先来看下hive中如何建表,并通过分析建表语句了解hive中数据的存储解析方式

    create table tutorial (
    name string,                     //string类型字段name
    number int,                      //int类型字段number
    resource array<string>,               //string数组类型字段
    detail map<string, int>                //字典类型(key为字符串,value为整型)
    ) partitioned by (dt string)            //按dt分区,dt类型为string
    row format delimited fields terminated by ' '    //指定列分隔符为tab
    collection items terminated by ','          //指定数组中字段分隔符为逗号
    map keys terminated by ':' ;              //指定字典中KV分隔符为冒号

    根据上面的建表语句,对应的数据应该长这样:

    balabala2 222 str1,str2,str3 a:1,b:2,c:3

    balabala3 333 str4,str5,str6 d:4,e:5,f:6

    ....

    hive在读取数据时,首先根据TAB对列进行分隔,得到name, number, source, detail,name和number不用继续处理,可直接使用

    source和detail属于复杂数据类型,hive需要再次进行解析:根据逗号分隔source,detail,再根据冒号分隔detail中每一项的key和value

    ps. 这其中涉及到一个概念:读时模式 和 写时模式

    读时模式:加载数据时进行数据检验(hive)

    写时模式:写入数据时对照模式进行检查(传统RDBMS)

    元数据

    hive中的表由两部分组成:一是元数据(可以简单理解为表结构),二是数据,数据解析刚才分析过了,接下来看下元数据

    元数据有三种存储方式:

    1. 内嵌derby:缺点不支持多会话

    2. 本机mysql

    3. 远端mysql

    目前我们的hadoop机器采用本机mysql的方式,数据存放在mysql中的metastore数据库内

    metastore中几个重要的表:

    1. dbs:存放hive所有数据库信息

    2. tbls:存放hive所有表格信息

    3. table_params:存放hive所有表格的参数信息

    4. columns_v2:存放表格的字段信息

    刚才表的信息在mysql中存储为:

    分区partition

    按照某几列的值对数据进行划分

    tutorial表按照列dt进行划分,目录结构如下图:

    桶bucket

    两个用途:

    1. 采样:用于对一小部分数据进行测试

    2. 加速map-side join:HiveQL相关,不做讨论

    索引

    创建索引的语句:

    CREATE INDEX idx ON TABLE db_player (yys, server_name, player_id) AS 'COMPACT' WITH DEFERRED REBUILD;

    ALTER INDEX idx ON db_player REBUILD;

    测试数据:

    文件大小721MB,创建索引所需时间66s,索引大小531MB

    查询速度对比:无索引16s,有索引11s

    在创建索引后,发现索引文件是保存在HDFS上的,目录为:/user/hive/warehouse/gcld.db/gcld__db_player_idx__/

    我们来看下索引文件的具体内容:

    看到上图相信大家就一目了然了,前三列是建立索引时指定的列(yys, server_name, player_id),第四列是数据的绝对路径,第五列是一个数字,应该是类似地址的东西

    在利用索引进行查询时,首先查询索引文件,然后根据前三列直接定位到数据在文件中的位置

  • 相关阅读:
    递归
    高等数学思维导图——1.函数与极限
    sort方法和自定义比较器的写法
    PriorityQueue(优先队列)
    常用JAVA API :HashSet 和 TreeSet
    常用Java API:HashMap 和 TreeMap
    ArrayList、Vector和LinkedList的区别
    构造方法
    面向对象特点:封装、继承、多态
    匿名对象
  • 原文地址:https://www.cnblogs.com/justff/p/3453678.html
Copyright © 2020-2023  润新知