如何创建 Hive 表的几种类型?

基于 MySql 的远程模式安装的 Hive 中的表存储在 hdfs 的 /user/hive/warehouse 目录下。

hive 的表主要有 5 中类型:

  1. 内部表
  2. 分区表
  3. 外部表
  4. 桶表
  5. 视图

一、内部表

  • 对应一个目录,表中的数据对应一个文件

  • 文件存储在 hdfs 的 Datanode 的数据块中,数据块默认的大小是 128m(Hadoop2.x的版本,1.x版本是 64m)

  • 表的元信息(表名,列名,列的类型)存储在 mysql 数据库的表中(TBLS -> 表信息,COLUMNS_V2 -> 列信息)

  • 例:创建 emp 表,字段如下,数据文件列分隔符为 ","

    create table emp
    (empno int, ename string, job string, mgr int,
    hiredate string, sal int, comm int, deptno int)
    row fromat delimited fields terminated by ',';
    
    • 导入数据:
    # 导入HDFS的数据,/ 是HDFS的根
    load data inpath '/data/emp.csv' into table emp;
    # 导入本地Linux数据,/ 是Linux的根
    load data local inpath '/root/data/emp.csv' into table emp;
    
  • emp.csv 文件内容:

    7369,SMITH,CLERK,7902,1980/12/17,800,,20
    7499,ALLEN,SALESMAN,7698,1981/2/20,1600,300,30
    7521,WARD,SALESMAN,7698,1981/2/22,1250,500,30
    7566,JONES,MANAGER,7839,1981/4/2,2975,,20
    7654,MARTIN,SALESMAN,7698,1981/9/28,1250,1400,30
    7698,BLAKE,MANAGER,7839,1981/5/1,2850,,30
    7782,CLARK,MANAGER,7839,1981/6/9,2450,,10
    7788,SCOTT,ANALYST,7566,1987/4/19,3000,,20
    7839,KING,PRESIDENT,,1981/11/17,5000,,10
    7844,TURNER,SALESMAN,7698,1981/9/8,1500,0,30
    7876,ADAMS,CLERK,7788,1987/5/23,1100,,20
    7900,JAMES,CLERK,7698,1981/12/3,950,,30
    7902,FORD,ANALYST,7566,1981/12/3,3000,,20
    7934,MILLER,CLERK,7782,1982/1/23,1300,,10
    
  • 查询 emp 表中的内容:
    如何创建 Hive 表的几种类型?_第1张图片

  • 注意:导入数据其实是 Ctrl + x 操作,在实际应用中,数据文件一般几十G,非常消耗服务器性能,所以一般在实际开发中使用外部表,只建立与外部数据之间的联系。

二、分区表

  • 对应一个目录,分区也对应一个目录,分区中的数据对应文件

  • 分区表可以提高查询效率

  • 例:创建 emp_part 表,字段如下(表的字段没有 deptno),数据文件列分隔符为 ","

    create table emp_part
    (empno int, ename string, job string, mgr int,
    hiredate string, sal int, comm int)
    partitioned by (deptno int)
    row fromat delimited fields terminated by ',';
    
  • 向分区表中插入数据:

    insert into table emp_part partition(deptno=10)
    select empno, ename, job, mgr, hiredate, sal, comm from emp where deptno = 10;
    
    insert into table emp_part partition(deptno=20)
    select empno, ename, job, mgr, hiredate, sal, comm from emp where deptno = 20;
    
  • 查询分区表中的数据:
    如何创建 Hive 表的几种类型?_第2张图片

  • 分区表在 HDFS 上的存储格式:
    如何创建 Hive 表的几种类型?_第3张图片
    如何创建 Hive 表的几种类型?_第4张图片
    如何创建 Hive 表的几种类型?_第5张图片

三、外部表

  • 指向已经存在与 HDFS 中的数据

  • 创建过程:加载数据和创建表同时完成,不会移动数据文件到 /user/hive/warehouse 目录下,创建了外部表后 /use/hive/warehouse 目录下根本不会生成表名所对应的目录

  • 删除外部表时,仅把在 MySql 中存储的该外部表的元信息给删除了

  • 例:创建 ex_student 表,字段如下,数据文件存储在 HDFS 的 /students 目录下

    create external table ex_student
    (sid int, sname string, age int)
    row format delimited fields terminated by ','
    location '/students';
    
  • HDFS 的 /students 目录下的文件的内容如下:

    1,MrQuJL,22
    2,zhangsan,30
    3,wangwu,70
    4,lisi,80
    
  • 查询外部表中的数据:
    如何创建 Hive 表的几种类型?_第6张图片

四、桶表

  • 表对应目录,对应文件

  • 桶表是对存入的数据按照某个字段进行哈希取值,值相同的放到同一个文件存储

  • 创建 emp_bucket 表,字段如下,按照 job 字段分成四个桶

    create table emp_bucket
    (empno int, ename string, job string, mgr int, hiredate string,
    sal int, comm int, deptno int)
    clustered by (job) into 4 buckets
    row format delimited fields terminated by ',';
    
  • 通过查询插入数据:

    insert into emp_bucket select * from emp;
    
  • 查询桶表中的数据:
    如何创建 Hive 表的几种类型?_第7张图片

  • 桶表中的数据在 HDFS 上的存储格式:
    如何创建 Hive 表的几种类型?_第8张图片
    如何创建 Hive 表的几种类型?_第9张图片

五、视图

  • 视图是一种虚表,建立在已有表的基础上

  • 视图并不能提高查询效率,只是简化了复杂查询

  • 创建视图:

    create view myview as select * from emp;
    
  • 查询视图:
    如何创建 Hive 表的几种类型?_第10张图片

关注我的微信公众号(曲健磊的个人随笔),观看更多精彩内容:
如何创建 Hive 表的几种类型?_第11张图片

你可能感兴趣的:(【hive】)