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表的划分。

  • 相关阅读:
    [原创] Python3.6+request+beautiful 半次元Top100 爬虫实战,将小姐姐的cos美图获得
    手算平方根和基于 Java BigInteger 的大整数平方根的实现
    Spyder项目创建,打开与使用
    手动实现自己的spring事务注解
    springboot2.x配置druid sql监控
    基于zookeeper实现分布式锁
    数据库中间件之mycat读写分离
    springboot + shiro 构建权限模块
    数据库中间件之mycat安装部署(一)
    使用jdk8 stream简化集合操作
  • 原文地址:https://www.cnblogs.com/sqdmydxf/p/7771605.html
Copyright © 2011-2022 走看看