Hive四大表类型内部表、外部表、分区表和桶表

一、概述

总体上Hive有四种表:外部表,内部表(管理表),分区表,桶表。分别对应不同的需求。下面主要讲解各种表的适用情形、创建和加载数据方法。

二、具体内容

1.内部表

创建内部表和加载数据

  1.  
    create table emp_inner(
  2.  
    empno int,
  3.  
    ename string,
  4.  
    job string,
  5.  
    mgr int,
  6.  
    hiredate string,
  7.  
    sal double,
  8.  
    comm double,
  9.  
    deptno int
  10.  
    )
  11.  
    row format delimited fields terminated by '\t'
  12.  
    LOCATION '/user/hive/warehouse/hadoop.db/emp';

2.外部表

(1)适用情形:

当一份日志需要多个小组一起分析,分析完了之后创建的表就可以删除了。但是普通的表删除的同时也会把数据删除,这样就会影响到其他小组的分析,而且日志数据也不能随便删除。所以,需要外部表,删除外部表,不会删除对应的hdfs上的数据。

(2)创建外部表

  1.  
    create EXTERNAL table dept_ext(
  2.  
    deptno int,
  3.  
    dname string,
  4.  
    loc string
  5.  
    )
  6.  
    row format delimited fields terminated by '\t' ;
  7.  
    load data local inpath '/opt/datas/dept.txt' into table dept_ext;

(3)对比外部表和内部表区别
    删除外部表,数据不会有任何改变,只是mysql中的元数据被修改,但是删除内部表(管理表),数据就会被删除。

总结:hive内部表和外部表的区别
        1)创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。
        2)删除表时:在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据

3、临时表

(1)适用情形

临时分析,在关闭hive客户端后,临时表就会消失。主要用于存储不重要中间结果集,不重要的表。

(2)创建临时表并加载数据

  1.  
    create TEMPORARY table dept_tmp(
  2.  
    deptno int,
  3.  
    dname string,
  4.  
    loc string
  5.  
    )
  6.  
    row format delimited fields terminated by '\t';
  7.  
     
  8.  
    load data local inpath '/opt/datas/dept.txt' into table dept_tmp;

(3)查看location信息

  1.  
    desc formatted dept_tmp;
  2.  
    Location: hdfs://172.19.199.187:8020/tmp/hive/hadoop/68174383-f427-4629-9707-0ab1c9b07726/_tmp_space.db/d872efec-1294-48b0-9071-31cf98d46400
  3.  
    Table Type: MANAGED_TABLE

4、分区表【***】

(1)适用情形

普通的表:select * from logs where date = '20171209',执行流程:对全表的数据进行查询,然后才过滤操作。

分区表:select * from logs where date = '20171209',执行流程:直接加载对应文件路径下的数据。适用于大数据量,可以通过分区快速定位需要查询的数据,分区表的作用主要是提高了查询检索的效率 。

(2)创建一级分区并且加载数据

  1.  
    create table emp_part(
  2.  
    empno int,
  3.  
    ename string,
  4.  
    job string,
  5.  
    mgr int,
  6.  
    hiredate string,
  7.  
    sal double,
  8.  
    comm double,
  9.  
    deptno int
  10.  
    )partitioned by (`datetime` string)
  11.  
    row format delimited fields terminated by '\t';
  12.  
     
  13.  
    load data local inpath '/opt/datas/emp.txt' into table emp_part partition(`datetime`='20171209');
  14.  
    load data local inpath '/opt/datas/emp.txt' into table emp_part partition(`datetime`='20171208');
  15.  
    【在hdfs上形成两个文件夹,emp.txt存储在里面】
  16.  
    /user/hive/warehouse/hadoop.db/emp_part/datetime=20171208
  17.  
    /user/hive/warehouse/hadoop.db/emp_part/datetime=20171209
  18.  
     
  19.  
    查询结果:
  20.  
    select * from emp_part where `datetime` = '20171209';

(3)创建二级分区并且加载数据

  1.  
    create table emp_part2(
  2.  
    empno int,
  3.  
    ename string,
  4.  
    job string,
  5.  
    mgr int,
  6.  
    hiredate string,
  7.  
    sal double,
  8.  
    comm double,
  9.  
    deptno int
  10.  
    )partitioned by (`datetime` string,hour string)
  11.  
    row format delimited fields terminated by '\t';
  12.  
     
  13.  
    load data local inpath '/opt/datas/emp.txt' into table emp_part2 partition(`datetime`='20171209',hour='01');
  14.  
     
  15.  
    load data local inpath '/opt/datas/emp.txt' into table emp_part2 partition(`datetime`='20171209',hour='02');
  16.  
    【在hdfs上,形成目录】
  17.  
    /user/hive/warehouse/hadoop.db/emp_part2/datetime=20171209/hour=01
  18.  
    /user/hive/warehouse/hadoop.db/emp_part2/datetime=20171209/hour=02

查询结果:

  1.  
    -》select * from emp_part2 where `datetime` = '20171209';
  2.  
    查看/user/hive/warehouse/hadoop.db/emp_part2/datetime=20171209内的所有数据(即两倍的emp.txt数据)
  3.  
    -》select * from emp_part2 where `datetime` = '20171209' and hour = '01';
  4.  
    查看/user/hive/warehouse/hadoop.db/emp_part2/datetime=20171209/hour=01内的所有数据(即emp.txt数据)

(4)创建外部分区表(删除的时候,只是元数据删除,数据是不会删除的)

  1.  
    create EXTERNAL table emp_test(
  2.  
    empno int,
  3.  
    ename string,
  4.  
    job string,
  5.  
    mgr int,
  6.  
    hiredate string,
  7.  
    sal double,
  8.  
    comm double,
  9.  
    deptno int
  10.  
    )
  11.  
    PARTITIONED BY(date string,hour string)
  12.  
    row format delimited fields terminated by '\t';

(5)加载分区表数据方法

(a)直接通过load命令(指定partition),加载数据到表的某个分区中,select是可以查询到的。

load data local inpath '/opt/datas/emp.txt' into table emp_part2 partition(`datetime`='20171209',hour='01');

(b)手动创建目录/user/hive/warehouse/hadoop.db/emp_part2/datetime=20171209/hour=03,然后put上数据,表select查询是查询不到的。然后,使用alter将路径添加到原数据库mysql数据库中。

alter table emp_part2 add partition(`datetime`='20171209',hour='03');

5、桶表

(1)使用情形

数据有严重的数据倾斜,分布不均匀,但是相对来说每个桶中的数据量会比较平均。桶于桶之间做join等查询的时候,会有优化。

(2)创建并使用

首先,

 set hive.enforce.bucketing = true; 

然后,

  1.  
    create table emp_bu(
  2.  
    empno int,
  3.  
    ename string,
  4.  
    job string,
  5.  
    mgr int,
  6.  
    hiredate string,
  7.  
    sal double,
  8.  
    comm double,
  9.  
    deptno int
  10.  
    )CLUSTERED BY(deptno) INTO 4 BUCKETS
  11.  
    row format delimited fields terminated by '\t';

最后加载数据,使用insert

insert overwrite table emp_bu_2 select * from emp;
也可以指定分区写入 insert overwrite

hive 四种表,分区表,内部,外部表,桶表的更多相关文章

  1. 【hive】——Hive四种数据导入方式

    Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询出相应的数据并导入到Hive表中:(4).在 ...

  2. Hive四种数据导入方式介绍

    问题导读 1.从本地文件系统中通过什么命令可导入数据到Hive表? 2.什么是动态分区插入? 3.该如何实现动态分区插入? 扩展: 这里可以和Hive中的三种不同的数据导出方式介绍进行对比? Hive ...

  3. java 四种内部类和内部接口

    /** * 常规内部类:常规内部类没有用static修饰且定义在在外部类类体中. * 1.常规内部类中的方法可以直接使用外部类的实例变量和实例方法. * 2.在常规内部类中可以直接用内部类创建对象 * ...

  4. hive四种排序

    order by order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)只有一个reducer,会导致当输入规模较大时,需要较长的计算时间. set h ...

  5. Hive总结(七)Hive四种数据导入方式

  6. 分区表,桶表,外部表,以及hive一些命令行小工具

    hive中的表与hdfs中的文件通过metastore关联起来的.Hive的数据模型:内部表,分区表,外部表,桶表受控表(managed table):包括内部表,分区表,桶表 内部表: 我们删除表的 ...

  7. Hive 学习之路(五)—— Hive 分区表和分桶表

    一.分区表 1.1 概念 Hive中的表对应为HDFS上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为HDFS上表目录的子目录,数据按照分区存储在子目录中.如 ...

  8. Hive 系列(五)—— Hive 分区表和分桶表

    一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...

  9. 入门大数据---Hive分区表和分桶表

    一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...

随机推荐

  1. golang在多个go routine中进行map或者slice操作应该注意的对象。

    因为golang的map和列表切片都是引用类型,且非线程安全的,所以在多个go routine中进行读写操作的时候,会产生“map read and map write“的panic错误. 某一些类型 ...

  2. (读论文)推荐系统之ctr预估-NFM模型解析

    本系列的第六篇,一起读论文~ 本人才疏学浅,不足之处欢迎大家指出和交流. 今天要分享的是另一个Deep模型NFM(串行结构).NFM也是用FM+DNN来对问题建模的,相比于之前提到的Wide& ...

  3. 解决axios接收二进制流文件乱码问题

    1. 须将axios 配置中的responseType设置为'arraybuffer',这样就不会让表格出现乱码现象: 2. 如果要动态设置文件名则需要让后台将名字设置到响应头中,否则将是一个乱码的文 ...

  4. [重磅开源] 比SingleR更适合的websocket 即时通讯组件---ImCore开源了

    有感而发 为什么说 SignalR 不合适做 IM? IM 的特点必定是长连接,轮训的功能用不上. 因为它是双工通讯的设计,用hub.invoke发送命令给服务端处理业务,其他就和 ajax 差不多, ...

  5. C# 10分钟完成百度图片提取文字(文字识别)——入门篇

    现在图片文字识别已经很成熟了,比如qq长按图片,点击图片识别就可以识别图片的文字,将不认识的.文字数量大的.或者不能赋值的值进行二次可复制功能. 我们现在就基于百度Ai开放平台进行个人文字识别,dem ...

  6. maysql的自增字段

    因为mysql中的自增字段与oracle数据库是不一样的,所以在这里唠嗑一下mysql的自增字段 1.添加自增字段 1.1 在创建表时添加 create table emp( empno ) auto ...

  7. PythonDay05

    第五章 今日内容 字典 字典 语法:{'key1':1,'key2':2} 注意:dict保存的数据不是按照我们添加进去的顺序保存的. 是按照hash表的顺序保存的. ⽽hash表 不是连续的. 所以 ...

  8. ASP.NET Core Web API 跨域(CORS) Cookie问题

    身为一个Web API,处理来自跨域不同源的请求,是一件十分合理的事情. 先上已有的文章,快速复制粘贴,启用CORS: Microsoft:启用 ASP.NET Core 中的跨域请求 (CORS) ...

  9. tensorflow学习笔记——使用TensorFlow操作MNIST数据(2)

    tensorflow学习笔记——使用TensorFlow操作MNIST数据(1) 一:神经网络知识点整理 1.1,多层:使用多层权重,例如多层全连接方式 以下定义了三个隐藏层的全连接方式的神经网络样例 ...

  10. Mybatis学习笔记之---动态sql中标签的使用

    动态Sql语句中标签的使用 (一)常用标签 1.<if> if标签通常用于WHERE语句中,通过判断参数值来决定是否使用某个查询条件, 他也经常用于UPDATE语句中判断是否更新某一个字段 ...