Hive External Table 外部表

本文详细介绍了Hive中外部表的使用方法,包括创建、加载数据及查询等操作步骤,并对比了外部表与内部表在数据存储上的差异。

Hive 的外部表与内部表区别

  1. 在导入数据到外部表,数据导入到建表语句中 LOCATION 参数指定的 HDFS 目录下即可;
  2. 删除表的时候,Hive 会将表的元数据信息删除掉,但导入的数据信息是不会被删除的;

Hive 外部表示例

1)创建外部表

创建的时候用 LOCATION 指定原数据存储的路径,不指定的话 hive 会在 /usr/hive/warehouse 下以外部表的表名创建目录并将数据存储在这里

创建表

$ CREATE EXTERNAL TABLE t_external (year string, month int, num int)

        ROW FORMAT DELIMITED

        FIELDS TERMINATED BY ','

        LOCATION '/user/test/t_extends'

此时在 HDFS 上创建了空目录 /user/test/t_extends

同时,在 MySQL 中记录的 Hive 元数据中添加了表的信息:

mysql > select * from TBLS\G;

*************************** 5. row ***************************                                                                                                       
            TBL_ID: 21                                                                                                                                               
       CREATE_TIME: 1663561577                                                                                                                                       
             DB_ID: 1                                                                                                                                                
  LAST_ACCESS_TIME: 0                                                                                                                                                
             OWNER: hadoop                                                                                                                                           
        OWNER_TYPE: USER                                                                                                                                             
         RETENTION: 0                                                                                                                                                
             SD_ID: 21                                                                                                                                               
          TBL_NAME: t_external                                                                                                                                       
          TBL_TYPE: EXTERNAL_TABLE                                                                                                                                   
VIEW_EXPANDED_TEXT: NULL                                                                                                                                             
VIEW_ORIGINAL_TEXT: NULL                                                                                                                                             
IS_REWRITE_ENABLED:                                                                                                                                                  
5 rows in set (0.00 sec)     

数据文件 t_extends.txt

$ vim t_extends.txt

2019,02,15                                                                                                                                                           
2020,10,01                                                                                                                                                           
2021,03,19                                                                                                                                                           
2022,01,10                                                                                                                                                           
2022,03,21                                                                                                                                                           
2022,09,19

加载数据

可用:

$ hdfs dfs -put t_extends.txt /user/test/t_extends

也可以用:

hive> load data local inpath '/home/centosm/test/hive' into table t_external

加载数据后文件被导入到 /user/test/t_extends/ 目录下:

$ hdfs dfs -ls /user/test/t_extends/

Found 1 items                                                                                                                                                        
-rw-r--r--   3 hadoop supergroup         66 2022-09-19 14:18 /user/test/t_extends/t_extends.txt   

文件内容

$ hdfs dfs -cat /user/test/t_extends/t_extends.txt

2022-09-19 14:43:42,163 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false                           
2019,02,15                                                                                                                                                           
2020,10,01                                                                                                                                                           
2021,03,19                                                                                                                                                           
2022,01,10                                                                                                                                                           
2022,03,21                                                                                                                                                           
2022,09,19   

在 hive 中查询 t_external 表

hive> select * from t_external;

OK                                                                                                                                                                   
2019    2       15                                                                                                                                                   
2020    10      1                                                                                                                                                    
2021    3       19                                                                                                                                                   
2022    1       10                                                                                                                                                   
2022    3       21                                                                                                                                                   
2022    9       19                                                                                                                                                   
Time taken: 3.177 seconds, Fetched: 6 row(s)  

查询外部表中的文件路径

hive> select INPU__FILE__NAME form t_external;

OK                                                                                                                                                                   
hdfs://mycluster/user/test/t_extends/t_extends.txt                                                                                                                   
hdfs://mycluster/user/test/t_extends/t_extends.txt                                                                                                                   
hdfs://mycluster/user/test/t_extends/t_extends.txt                                                                                                                   
hdfs://mycluster/user/test/t_extends/t_extends.txt                                                                                                                   
hdfs://mycluster/user/test/t_extends/t_extends.txt                                                                                                                   
hdfs://mycluster/user/test/t_extends/t_extends.txt                                                                                                                   
Time taken: 0.213 seconds, Fetched: 6 row(s) 

删除表

如果删除表,表的元信息被删除,因为是外部表,数据文件没有被删除:

hive> drop table t_external;

MySQL 中元数据被删除:

mysql> select * from TBLS where TBL_NAME='t_external';

Empty set (0.00 sec)

数据文件还在:

$ hdfs dfs -ls /user/test/t_extends/

Found 1 items                                                                                                                                                        
-rw-r--r--   3 hadoop supergroup         66 2022-09-19 14:18 /user/test/t_extends/t_extends.txt 

### 区别 内部表和外部表Hive 中两种重要的表类型,它们在数据存储、生命周期、数据共享和迁移等方面存在显著差异。内部表适用于数据完全由 Hive 管理,数据生命周期短,不需要与其他系统共享数据的场景。外部表适用于数据需要与其他系统共享,数据生命周期长,需要长期保留的场景 [^2]。 Hive的数据分为表数据和元数据,表数据是 Hive 中表格具有的数据,而元数据是用来存储表的名字、表的列和分区及其属性等。无论内部表还是外部表Hive 都在 Hive Metastore 中管理表定义、字段类型等元数据信息。删除内部表时,除了会从 Metastore 中删除表元数据,还会从 HDFS 中删除其所有数据文件;删除外部表时,只会从 Metastore 中删除表的元数据,并保持 HDFS 位置中的实际数据不变 [^1][^4]。 当希望 Hive 完全控制数据的存储位置和生命周期,并且删除表时数据也应被删除,选择内部表;当数据独立于 Hive 存在或被共享,Hive 只是用来查询它,并且需要确保删除 Hive 表定义不会删除底层数据,选择外部表,这是保护重要数据和实现多引擎共享的推荐做法 [^3]。 ### 创建 - **内部表创建示例**: ```sql CREATE TABLE internal_table ( id INT, name STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; ``` - **外部表创建示例**: ```sql CREATE EXTERNAL TABLE external_table ( id INT, name STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/path/to/external/data'; ``` ### 使用 内部表和外部表在使用上,查询语句基本一致。例如查询内部表和外部表: ```sql SELECT * FROM internal_table; SELECT * FROM external_table; ``` 内部表由于数据完全由 Hive 管理,在插入、更新等操作时,Hive 可以更直接地处理。而外部表更多用于读取已经存在的数据,并且可以与其他系统共享数据。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值