Hive内部表和外部表的区别

    xiaoxiao2021-03-25  140

    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上的文件夹也删除了。

    转载请注明原文地址: https://ju.6miu.com/read-7450.html

    最新回复(0)