现在的位置: 首页 > 综合 > 正文

Hive内部表和外部表

2018年02月08日 ⁄ 综合 ⁄ 共 1618字 ⁄ 字号 评论关闭

一:背景

Hive中表分为两大类托管表(Managed table)也称之为受控表或内部表另外一种表是外部表(External table)。默认情况下,创建hive表时,hive会把数据存储到它的数据仓库目录下,这种方式创建的表我们称之为受控表。另外一种方式是创建一个外部表(External table)。此时,我们只需要告诉hive数据的外部引用地址,hive本身不会在自己的数据仓库目录下存储这些数据。

二:示例分析

1.内部表:

drop table if exists employees;
create table if not exists employees(
        name STRING,
        salary FLOAT,
        subordinates ARRAY<STRING>,
        deductions MAP<STRING,FLOAT>,
        address STRUCT<street:STRING,city:STRING,num:INT>
)
row format delimited fields terminated by '\t'
collection items terminated by ','
map keys terminated by ':'
lines terminated by '\n'
stored as textfile
location '/hive/inner';

注:location表示指向实际数据的路径(HDFS中的路径)

这样我们就在Hive里面创建了一张内部表,现在我们来给这张表插入数据:

hive> load data local inpath '/usr/local/src/employee_data' into table employees;
Copying data from file:/usr/local/src/employee_data
Copying file: file:/usr/local/src/employee_data
Loading data to table hive.employees
OK
Time taken: 0.14 seconds

当我们插入数据后,实际数据会保存在我建表指定的路径下(我这里是hdfs://XXX:9000/hive/inner目录下),不配置时会在默认的数据仓库的位置。

本地文件中数据的格式应该和表结构对应:

注:千万要注意一点就是,做表删除操作,当删除一张内部表时,存储数据的目录也会被删除,也就是说我们的实际数据也会被删除。这也是内部表比较恶心。还好外部表可以解决这个问题。

2.外部表

drop table if exists employees;
create external table if not exists employees(
        name STRING,
        salary FLOAT,
        subordinates ARRAY<STRING>,
        deductions MAP<STRING,FLOAT>,
        address STRUCT<street:STRING,city:STRING,num:INT>
)
row format delimited fields terminated by '\t'
collection items terminated by ','
map keys terminated by ':'
lines terminated by '\n'
stored as textfile
location '/hive/external';

插入数据:

 load data local inpath '/usr/local/src/employee_data' into table employees;
Copying data from file:/usr/local/src/employee_data
Copying file: file:/usr/local/src/employee_data
Loading data to table default.employees
OK

注:删除外部表时保存在HDFS中的实际数据并不会被删除。这也是不同于内部表的一个重要特性!

抱歉!评论已关闭.