内部表/外部表

未被external修饰的是内部表(managed table),被external修饰的为外部表(external table),默认创建内部表;
区别:
内部表数据由Hive自身管理,外部表数据由HDFS管理;
内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己指定,若未指定则存储位置同内部表;
删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;
对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)
创建内部表a:

CREATE TABLE a (  
    id int,  
    name string,  
    area string  
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

hive导入外部表和内部表并压缩 hive加载数据到外部表_Hive


创建外部表b:

CREATE EXTERNAL TABLE b (  
    id int,  
    name string,  
    area string,  
    code string  
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

创建外部表c,指定目录:

CREATE EXTERNAL TABLE c (  
    id int,  
    name string,  
    area string,  
    code string  
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' location '/hive/b ';

hive导入外部表和内部表并压缩 hive加载数据到外部表_hive_02


数据文件(sourceA.txt):

1,zhao,BJ

2,qian,SH

3,sun,HZ

4,li,SD

5,zhang,SC

数据文件(sourceB.txt):

1,zhao,BJ,11

2,qian,SH,22

3,sun,HZ,33

4,li,SD,44

5,zhang,SC,55

装载数据

本地文件:

LOAD DATA LOCAL INPATH '/home/hadoop/sourceA.txt' INTO TABLE a; 
LOAD DATA LOCAL INPATH '/home/hadoop/sourceB.txt' INTO TABLE b;

HDFS文件:

将sourceB.txt传到HDFS中, /hive/sourceB.txt中

hive导入外部表和内部表并压缩 hive加载数据到外部表_hadoop_03

LOAD DATA INPATH '/hive/sourceB.txt' INTO TABLE c;

hive导入外部表和内部表并压缩 hive加载数据到外部表_hive_04


查看表中数据:

hive导入外部表和内部表并压缩 hive加载数据到外部表_hive导入外部表和内部表并压缩_05


查看hive表在hdfs上的存储位置:

hive导入外部表和内部表并压缩 hive加载数据到外部表_hive导入外部表和内部表并压缩_06


hive导入外部表和内部表并压缩 hive加载数据到外部表_Hive_07


hive导入外部表和内部表并压缩 hive加载数据到外部表_hadoop_08


删除外部表c,查看数据是否还存在:

hive导入外部表和内部表并压缩 hive加载数据到外部表_Hive_09


hive导入外部表和内部表并压缩 hive加载数据到外部表_java_10


重新创建表c不导入数据直接查询:

hive导入外部表和内部表并压缩 hive加载数据到外部表_hive导入外部表和内部表并压缩_11

Hive数据导出的方式

导出到本地文件系统

hive> INSERT OVERWRITE LOCAL DIRECTORY '/home/hadoop/output' ROW FORMAT DELIMITED FIELDS TERMINATED by ',' select * from a;

hive导入外部表和内部表并压缩 hive加载数据到外部表_java_12


导出到HDFS

导入到HDFS和导入本地文件类似,去掉HQL语句的LOCAL就可以了

hive> INSERT OVERWRITE DIRECTORY '/hiveoutput' ROW FORMAT DELIMITED FIELDS TERMINATED by ',' select * from a;

hive导入外部表和内部表并压缩 hive加载数据到外部表_hadoop_13


采用hive的-e和-f参数来导出数据。

参数为: -e 的使用方式,后面接SQL语句,>>后面为输出文件路径

hive -e "select * from a" >> /home/hadoop/output/testA.txt

hive导入外部表和内部表并压缩 hive加载数据到外部表_hive_14


参数为: -f 的使用方式,后面接存放sql语句的文件。>>后面为输出文件路径

SQL语句文件:

cat /home/hadoop/output/msql.sql   
select * from a;

使用-f参数执行:

hive -f /home/hadoop/output/msql.sql >> /home/hadoop/output/testB.txt

hive导入外部表和内部表并压缩 hive加载数据到外部表_hive_15


EXPORT

将数据导出到HDFS

hive>export table a to '/hivea';

hive导入外部表和内部表并压缩 hive加载数据到外部表_hive_16


IMPORT

导入数据

hive> import from '/hivea';

hive导入外部表和内部表并压缩 hive加载数据到外部表_hive导入外部表和内部表并压缩_17


重命名表名:

  1. import table d from ‘/hivea’;