Hive 外部表
文章目录
外部表
外部表说明
外部表因为是指定其他的hdfs路径的数据加载到表当中来,所以hive表会认为自己不完全独占这份数据,所以删除hive表的时候,数据仍然存放在hdfs当中,不会删掉
管理表和外部表的使用场景
每天将收集到的网站日志定期流入HDFS文本文件。在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过SELECT+INSERT进入内部表。
操作案例
分别创建老师与学生表外部表,并向表中加载数据
创建老师表:
create external table teacher (t_id string,t_name string) row format delimited fields terminated by '\t';
hive (myhive)> create external table teacher (t_id string,t_name string)
> row format delimited fields terminated by '\t';
OK
Time taken: 0.416 seconds
hive (myhive)>
创建学生表:
create external table student (s_id string,s_name string,s_birth string , s_sex string ) row format delimited fields terminated by '\t';
hive (myhive)> create external table student(s_id string,s_name string,s_birth string, s_sex string)
> row format delimited fields terminated by '\t';
OK
Time taken: 0.043 seconds
hive (myhive)>
准备数据
链接:
提取码:njk8
下载student.csv 和 techer.csv(注意是techer.csv而不是teacher.csv,差了一个a)
从本地文件系统向表中加载数据
load data local inpath '/home/student.csv' into table student;
hive (default)> use myhive;
OK
Time taken: 4.001 seconds
hive (myhive)> load data local inpath '/home/student.csv' into table student;
Loading data to table myhive.student
Table myhive.student stats: [numFiles=1, totalSize=200]
OK
Time taken: 1.677 seconds
hive (myhive)> select * from student;
OK
student.s_id student.s_name student.s_birth student.s_sex
01 赵雷 1990-01-01 男
02 钱电 1990-12-21 男
03 孙风 1990-05-20 男
04 李云 1990-08-06 男
05 周梅 1991-12-01 女
06 吴兰 1992-03-01 女
07 郑竹 1989-07-01 女
08 王菊 1990-01-20 女
Time taken: 0.781 seconds, Fetched: 8 row(s)
hive (myhive)>
加载数据并覆盖已有数据
load data local inpath '/home/student.csv' overwrite into table student;
hive (myhive)> load data local inpath '/home/student.csv' overwrite into table student;
Loading data to table myhive.student
Table myhive.student stats: [numFiles=1, totalSize=200]
OK
Time taken: 0.321 seconds
hive (myhive)>
注意这里的overwrite代表覆盖的意思。
加了overwrite就会用新数据覆盖老数据,如果不加overwrite,就会向表末尾追加。
从hdfs文件系统向表中加载数据(需要提前将数据上传到hdfs文件系统,其实就是一个移动文件的操作)
cd /home
hdfs dfs -mkdir -p /hivedatas
hdfs dfs -put techer.csv /hivedatas/
load data inpath '/hivedatas/techer.csv' into table teacher;
hive (myhive)> load data inpath '/hivedatas/techer.csv' into table teacher;
Loading data to table myhive.teacher
Table myhive.teacher stats: [numFiles=1, totalSize=30]
OK
Time taken: 0.526 seconds
hive (myhive)>
外部表的特性:删掉techer表,hdfs的数据仍然存在,并且重新创建表之后,表中就直接存在数据
因为我们的techer表使用的是外部表,drop table之后,表当中的数据依然保留在hdfs上面
hive (myhive)> select * from teacher;
OK
teacher.t_id teacher.t_name
01 张三
02 李四
03 王五
Time taken: 0.469 seconds, Fetched: 3 row(s)
hive (myhive)> drop table teacher;
OK
Time taken: 1.155 seconds
hive (myhive)> create external table teacher(t_id string,t_name string) row format delimited fields terminated by '\t';
OK
Time taken: 0.454 seconds
hive (myhive)> select * from teacher;
OK
teacher.t_id teacher.t_name
01 张三
02 李四
03 王五
Time taken: 0.054 seconds, Fetched: 3 row(s)
hive (myhive)>
删除一个外部表,不会删除表中数据,如果再次创建相同的表,里边的数据会自动匹配到以前的数据。
因为hive认为这个表中的数据不是hive自己的,是属于大家的,所以不会删除大家的数据。
Hive中内部表与外部表的区别
Hive创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
需要注意的是传统数据库对表数据验证是 schema on write(写时模式),而 Hive在load时是不检查数据是否符合schema的,hive 遵循的是 schema on read(读时模式),只有在读的时候hive才检查、解析具体的数据字段、schema。
读时模式的优势是load data 非常迅速,因为它不需要读取数据进行解析,仅仅进行文件的复制或者移动。
写时模式的优势是提升了查询性能,因为预先解析之后可以对列建立索引,并压缩,但这样也会花费更多的加载时间。