hive作为基于hdfs的数据仓库,在构建表的时候,会有内部表和外部表,这里介绍两者的异同点。
相同点:1、他们都是用mysql或者derby作为元数据存储,他们在元数据的组织上是相同的,他们都是用hdfs做实际的数据存储,本身没有
数据存储的功能,需要借助HDFS。
2、他们都可以在建表的时候指定一个指向HDFS文件夹的路径,如果不指定这个路径,那么默认的hive表中的数据会保存在HDFS上
一个叫做"/user/hive/warehouse"上一个和表名称一样的文件夹中,例如student表则对应路径是/user/hive/warehouse/student。
"/user/hive/warehouse"是一个默认的路径,可以通过hive-site.xml文件来配置。
3、他们创建成功之后,通过load data inpath '/path/to/xxx' overwrite into table tb_name的方式导入hdfs上的数据到hive数据表
中时,被导的数据会被删除,在hdfs中,相当于移动文件。
4、在测试的过程中发现,内部表也可以指定hdfs上已经存在的一个目录,这样表一创建就有了数据,这样和外部表表现差不多,只是
在删除表的时候会有差异。
图(1)
如图所示,在hdfs上/usr/feiy目录下本来有student.txt文件和tbls文件夹,我们成功创建了一个不带location指向的外部表,该表的
数据最终显示是在/user/hive/warehouse/stuex目录下,这验证了第二点。
我们向stuex表中导入hdfs上/usr/feiy/student.txt的数据之后,发现/usr/feiy/student.txt文件不见了,验证了第三点。
接下来我们验证内部表的创建过程:
图(2)
内部表创建也可以指定一个location,这样验证了第二点,最后通过load data inpath导入数据之后,原来的hdfs上的文件就被删除了。验证了第三点。
异同点:
1、创建表的语句上外部表会有一个external的关键字。
2、删除表的时候,内部表不仅会删除元数据,还会会将hdfs上对应的目录删除掉,而外部表只是删除了元数据,并不会删除hdfs上的数
据。可以理解为外部表只是建立了一个元数据到hdfs的一个链接,最后删除表的时候,只是将这个链接断开了,而不是连同hdfs文件一起删除。
外部表删除过程:
图(3)
外部表删除之后,他的默认存储数据的目录和文件还存在。
内部表删除过程:
图(4)
图(1)中我们通过指定location的方式创建了内部表student,在这里图(4)中我删除表之后,对应在hdfs上的文件夹也删除了。