• hive学习笔记之三:内部表和外部表


    欢迎访问我的GitHub

    https://github.com/zq2599/blog_demos

    内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;

    《hive学习笔记》系列导航

    1. 基本数据类型
    2. 复杂数据类型
    3. 内部表和外部表
    4. 分区表
    5. 分桶
    6. HiveQL基础
    7. 内置函数
    8. Sqoop
    9. 基础UDF
    10. 用户自定义聚合函数(UDAF)
    11. UDTF

    本篇概览

    • 本文是《hive学习笔记》系列的第三篇,要学习的是各种类型的表及其特点,主要内容如下:
    1. 建库
    2. 内部表(也叫管理表或临时表)
    3. 外部表
    4. 表的操作
      接下来从最基本的建库开始

    建库

    1. 创建名为test的数据库(仅当不存在时才创建),添加备注信息test database
    create database if not exists test 
    comment 'this is a database for test';
    
    1. 查看数据库列表(名称模糊匹配):
    hive> show databases like 't*';
    OK
    test
    test001
    Time taken: 0.016 seconds, Fetched: 2 row(s)
    
    1. describe database命令查看此数据库信息:
    hive> describe database test;
    OK
    test	this is a database for test	hdfs://node0:8020/user/hive/warehouse/test.db	hadoop	USER	
    Time taken: 0.035 seconds, Fetched: 1 row(s)
    
    1. 上述命令可见,test数据库在hdfs上的存储位置是hdfs://node0:8020/user/hive/warehouse/test.db,打开hadoop的web页面,查看hdfs目录,如下图,该路径的文件夹已经创建,并且是以.db结尾的:

    在这里插入图片描述
    5. 新建数据库的文件夹都在/user/hive/warehouse下面,这是在中配置的,如下图红框:

    在这里插入图片描述
    6. 删除数据库,加上if exists,当数据库不存在时,执行该语句不会返回Error:

    hive> drop database if exists test;
    OK
    Time taken: 0.193 seconds
    

    以上就是常用的库相关操作,接下来实践表相关操作;

    内部表

    1. 按照表数据的生命周期,可以将表分为内部表和外部表两类;
    2. 内部表也叫管理表或临时表,该类型表的生命周期时由hive控制的,默认情况下数据都存放在/user/hive/warehouse/下面;
    3. 删除表时数据会被删除;
    4. 以下命令创建的就是内部表,可见前面两篇文章中创建的表都是内部表:
    create table t6(id int, name string)
    row format delimited 
    fields terminated by ',';
    
    1. t6表新增一条记录:
    insert into t6 values (101, 'a101');
    
    1. 使用hadoop命令查看hdfs,可见t6表有对应的文件夹,里面的文件保存着该表数据:
    [hadoop@node0 bin]$ ./hadoop fs -ls /user/hive/warehouse/t6
    Found 1 items
    -rwxr-xr-x   3 hadoop supergroup          9 2020-10-31 11:14 /user/hive/warehouse/t6/000000_0
    
    1. 查看这个000000_0文件的内容,如下可见,就是表内的数据:
    [hadoop@node0 bin]$ ./hadoop fs -cat /user/hive/warehouse/t6/000000_0
    101	a101
    
    1. 执行命令drop table t6;删除t6表,再次查看t6表对应的文件,发现整个文件夹都不存在了:
    [hadoop@node0 bin]$ ./hadoop fs -ls /user/hive/warehouse/
    Found 5 items
    drwxr-xr-x   - hadoop supergroup          0 2020-10-27 20:42 /user/hive/warehouse/t1
    drwxr-xr-x   - hadoop supergroup          0 2020-10-29 00:13 /user/hive/warehouse/t2
    drwxr-xr-x   - hadoop supergroup          0 2020-10-29 00:14 /user/hive/warehouse/t3
    drwxr-xr-x   - hadoop supergroup          0 2020-10-29 13:04 /user/hive/warehouse/t4
    drwxr-xr-x   - hadoop supergroup          0 2020-10-29 16:47 /user/hive/warehouse/t5
    

    外部表

    1. 创建表的SQL语句中加上external,创建的就是外部表了;
    2. 外部表的数据生命周期不受Hive控制;
    3. 删除外部表的时候不会删除数据;
    4. 外部表的数据,可以同时作为多个外部表的数据源共享使用;
    5. 接下来开始实践,下面是建表语句:
    create external table t7(id int, name string)
    row format delimited 
    fields terminated by ','
    location '/data/external_t7';
    
    1. 查看hdfs文件,可见目录/data/external_t7/已经创建:
    [hadoop@node0 bin]$ ./hadoop fs -ls /data/
    Found 1 items
    drwxr-xr-x   - hadoop supergroup          0 2020-10-31 12:02 /data/external_t7
    
    1. 新增一条记录:
    insert into t7 values (107, 'a107');
    
    1. 在hdfs查看t7表对应的数据文件,可以见到新增的内容:
    [hadoop@node0 bin]$ ./hadoop fs -ls /data/external_t7
    Found 1 items
    -rwxr-xr-x   3 hadoop supergroup          9 2020-10-31 12:06 /data/external_t7/000000_0
    [hadoop@node0 bin]$ ./hadoop fs -cat /data/external_t7/000000_0
    107,a107
    
    1. 试试多个外部表共享数据的功能,执行以下语句再建个外部表,名为t8,对应的存储目录和t7是同一个:
    create external table t8(id_t8 int, name_t8 string)
    row format delimited 
    fields terminated by ','
    location '/data/external_t7';
    
    1. 建好t8表后立即查看数据,发现和t7表一模一样,可见它们已经共享了数据:
    hive> select * from t8;
    OK
    107	a107
    Time taken: 0.068 seconds, Fetched: 1 row(s)
    hive> select * from t7;
    OK
    107	a107
    Time taken: 0.074 seconds, Fetched: 1 row(s)
    
    1. 接下来删除t7表,再看t8表是否还能查出数据,如下可见,数据没有被删除,可以继续使用:
    hive> drop table t7;
    OK
    Time taken: 1.053 seconds
    hive> select * from t8;
    OK
    107	a107
    Time taken: 0.073 seconds, Fetched: 1 row(s)
    
    1. 把t8表也删掉,再去看数据文件,如下所示,依然存在:
    [hadoop@node0 bin]$ ./hadoop fs -cat /data/external_t7/000000_0
    107,a107
    
    1. 可见外部表的数据不会在删除表的时候被删除,因此,在实际生产业务系统开发中,外部表是我们主要应用的表类型;

    表的操作

    1. 再次创建t8表:
    create table t8(id int, name string)
    row format delimited 
    fields terminated by ',';
    
    1. 修改表名:
    alter table t8 rename to t8_1;
    
    1. 可见修改表名已经生效:
    hive> alter table t8 rename to t8_1;
    OK
    Time taken: 0.473 seconds
    hive> show tables;
    OK
    alltype
    t1
    t2
    t3
    t4
    t5
    t6
    t8_1
    values__tmp__table__1
    values__tmp__table__2
    Time taken: 0.029 seconds, Fetched: 10 row(s)
    
    1. 添加字段:
    alter table t8_1 add columns(remark string);
    

    查看表结构,可见已经生效:

    hive> desc t8_1;
    OK
    id                  	int                 	                    
    name                	string              	                    
    remark              	string              	                    
    Time taken: 0.217 seconds, Fetched: 3 row(s)
    

    至此,咱们对内部表和外部表已经有了基本了解,接下来的文章学习另一种常见的表类:分区表;

    你不孤单,欣宸原创一路相伴

    1. Java系列
    2. Spring系列
    3. Docker系列
    4. kubernetes系列
    5. 数据库+中间件系列
    6. DevOps系列

    欢迎关注公众号:程序员欣宸

    微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...
    https://github.com/zq2599/blog_demos

  • 相关阅读:
    岭回归和LASSO
    涉及到的知识点有页连接符的使用、批量修改元器件属性等知识
    OrCAD中分立器件的Symbol绘制
    OrCAD来新建原理图工程、设置原理图页面、新建原理图库
    python控制TLP2041高压电源源码(modbus rtu,try捕获异常使用)
    pyqt5分离ui主线程到子线程
    modbus rtu协议
    pcb接地设计
    PSPICE参数扫描+光标跟踪曲线改变+窗口分多个坐标系
    ad 导入logo
  • 原文地址:https://www.cnblogs.com/bolingcavalry/p/14957162.html
Copyright © 2020-2023  润新知