内部表/外部表
未被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 ',';
创建外部表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 ';
数据文件(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中
LOAD DATA INPATH '/hive/sourceB.txt' INTO TABLE c;
查看表中数据:
查看hive表在hdfs上的存储位置:
删除外部表c,查看数据是否还存在:
重新创建表c不导入数据直接查询:
Hive数据导出的方式
导出到本地文件系统
hive> INSERT OVERWRITE LOCAL DIRECTORY '/home/hadoop/output' ROW FORMAT DELIMITED FIELDS TERMINATED by ',' select * from a;
导出到HDFS
导入到HDFS和导入本地文件类似,去掉HQL语句的LOCAL就可以了
hive> INSERT OVERWRITE DIRECTORY '/hiveoutput' ROW FORMAT DELIMITED FIELDS TERMINATED by ',' select * from a;
采用hive的-e和-f参数来导出数据。
参数为: -e 的使用方式,后面接SQL语句,>>后面为输出文件路径
hive -e "select * from a" >> /home/hadoop/output/testA.txt
参数为: -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
EXPORT
将数据导出到HDFS
hive>export table a to '/hivea';
IMPORT
导入数据
hive> import from '/hivea';
重命名表名:
- import table d from ‘/hivea’;