zoukankan      html  css  js  c++  java
  • 【Hive】表分类

    Hive中的表有多种类型,每种类型的表都有其适用的场景

    用于记录每种表的特性,创建方式以及一些注意事项

    1. internal/managed[内部表/托管表]

    由Hive完全管理表和数据的生命周期
    默认创建的表是内部表
    删除表的时候,数据也被删除

    2. external[外部表]

    是由LOCATION属性指定数据存放地,而不是由默认的warehouse决定的
    删除表的时候,表的元数据被删除了,但是数据还在

    创建示例

    CREATE EXTERNAL TABLE if not exists test_ext ( 
    name string, 
    str_arr ARRAY<string>, 
    t_struct STRUCT<sex:string,age:int>, 
    t_map MAP<string,int>, 
    t_map_arr MAP<string,ARRAY<string>> ) 
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' COLLECTION ITEMS TERMINATED BY ',' MAP KEYS TERMINATED BY ':' LOCATION '/user/xw/data/tmp';

    3. 临时表

    在hive session结束时被删除

    4. 分区表

    针对目录[将目录切分为子目录]

    显示分区

    SHOW PARTITIONS <table_name>;

    建立分区表

    create table test_partition(id int, name string, age int) 
    comment 'table description' PARTITIONED BY (year INT, month INT) row format 
    delimited fields terminated by ',' lines terminated by '
    ' 
    stored as textfile;

     分区表需要手动激活分区[即给分区建立子目录]

    alter table test_partition add partition(year=2017,month=3) partition(year=2017,month=4);

    删除分区

    alter table test_partition drop if exists partition(year=2017,month=3);

    向分区表加载数据

    load data local inpath '/home/xw/tmp/table.txt' overwrite into table test_partition partition(year=2016,month=2);

    常用的partition keys

    date and time
    locations
    business logics

    5. bucket表

    针对文件[将文件切割成片段]
    将指定列根据hash算法进行切割,对应列的值相同的记录始终会被划分到同一个桶中
    每个bucket的大小的设定:一个比较好的选择是将每个bucket的大小设置为hadoop的blocksize的两倍,例如,blocksize是256MB,则将每个bucket的大小设为512MB

    建立bucket表

    create table test_bucket(id int, name string, age int) 
    comment 'bucket table' clustered by(id) into 2 buckets row format delimited fields terminated by ',' lines terminated by '
    ' 
    stored as textfile;

    加载数据到bucket表

    INSERT OVERWRITE TABLE test_bucket SELECT * FROM test;

    注:不能使用load来加载数据,load加载数据只是将数据put到hdfs上,不经过MR,因而不会划分桶
    bucket的划分紧紧依赖于底层的数据加载,为了能够正确加载数据到bucket表中,我们可以:
    1.将reduce的数量设为自定义的bucket数
      set map.reduce.tasks = 2;
    2.设置可以强制划分bucket表
      set hive.enforce.bucketing = true;
    数据的加载是通过MR进行的,MR中shuffle过程中的拷贝即分区,就可以实现桶表的划分,MR中默认是按照key进行hash分区的,设置reduce的数目与划分bucket表的数量一致,就正好实现了bucket表的划分。

  • 相关阅读:
    WCF开发入门的实例
    转:SQLHelper类,泛型+反射
    设置ASP缓存的几个语句
    ADO.NET总结
    通过反射来实现:DataTable 和List 相互转换
    十步完成windows服务的安装
    dhl:The request for security token could not be satisfied because authentication failed. 调用方未由服务进行身份验证。
    C#中的readonly(运行时常量)与const(编译时常量)的区别
    用do{}创建内联子程序
    用autodie简化错误处理
  • 原文地址:https://www.cnblogs.com/sqdmydxf/p/7771605.html
Copyright © 2011-2022 走看看