`
flyingdutchman
  • 浏览: 353382 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

深入学习《Programing Hive》:Hive的数据模型(表)

    博客分类:
  • Hive
阅读更多
        Hive的数据类型
        Hive的基本数据类型有:TINYINT,SAMLLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,TIMESTAMP(V0.8.0+)和BINARY(V0.8.0+)。
        Hive的集合类型有:STRUCT,MAP和ARRAY。
       
        Hive主要有四种数据模型(即表):(内部)表、外部表、分区表和桶表。
        表的元数据保存传统的数据库的表中,当前hive只支持Derby和MySQL数据库。
        内部表:
        Hive中的表和传统数据库中的表在概念上是类似的,Hive的每个表都有自己的存储目录,除了外部表外,所有的表数据都存放在配置在hive-site.xml文件的${hive.metastore.warehouse.dir}/table_name目录下。
       
        CREATE TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING,
                 grade STRING COMMOT '班级')COMMONT '学生表'
        ROW FORMAT DELIMITED
        FIELDS TERMINATED BY ','
        STORE AS TEXTFILE;          
        

        外部表:
        外部表指向已经存在在Hadoop HDFS上的数据,除了在删除外部表时只删除元数据而不会删除表数据外,其他和内部表很像。
       
        CREATE EXTERNAL TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING,
                 class STRING COMMOT '班级')COMMONT '学生表'
        ROW FORMAT DELIMITED
        FIELDS TERMINATED BY ','
        STORE AS SEQUENCEFILE
        LOCATION '/usr/test/data/students.txt';            
        

        分区表:
        分区表的每一个分区都对应数据库中相应分区列的一个索引,但是其组织方式和传统的关系型数据库不同。在Hive中,分区表的每一个分区都对应表下的一个目录,所有的分区的数据都存储在对应的目录中。
        比如说,分区表partitinTable有包含nation(国家)、ds(日期)和city(城市)3个分区,其中nation = china,ds = 20130506,city = Shanghai则对应HDFS上的目录为:
               /datawarehouse/partitinTable/nation=china/city=Shanghai/ds=20130506/。
       
        CREATE TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING,
                 class STRING COMMOT '班级')COMMONT '学生表'
        PARTITIONED BY (ds STRING,country STRING)
        ROW FORMAT DELIMITED
        FIELDS TERMINATED BY ','
        STORE AS SEQUENCEFILE;            
        

        分区中定义的变量名不能和表中的列相同。
        桶区表:
        桶表就是对指定列进行哈希(hash)计算,然后会根据hash值进行切分数据,将具有不同hash值的数据写到每个桶对应的文件中。
       
        CREATE TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING,
                 class STRING COMMOT '班级',score SMALLINT COMMOT '总分')COMMONT '学生表'
        PARTITIONED BY (ds STRING,country STRING)
        CLUSTERED BY(user_no) SORTED BY(score) INTO 32 BUCKETS
        ROW FORMAT DELIMITED
        FIELDS TERMINATED BY ','
        STORE AS SEQUENCEFILE;            
        


        内部表和外部表的主要区别:
        1)、内部表创建要2步:表创建和数据加载,这两个过程可以同步执行。在数据加载的过程中,数据数据会移动到数据仓库的目录中;外部表的创建只需要一个步骤,表创建数据加载同时完成,表数据不会移动。
        2)、删除内部表时,会将表数据和表的元数据一同删除;而删除外部表时,紧删除表的元数据而不会删除表数据。     
        
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics