适用场景
在实际的生产环境中,建议在ods层使用外部表。
原因:
- 外部表不会加载数据到Hive的默认仓库(挂载数据),减少了数据的传输,同时还能和其他外部表共享数据。
- 使用外部表,Hive不会修改源数据,不用担心数据损坏或丢失。
- Hive在删除外部表时,删除的只是表结构,而不会删除数据。
区别:
1. 内部表
内部表创建时候,会在hdfs文件系统上面创建相应的路径文件夹,相关表的数据都会存在里面,如果是insert into 进去的数据,每一条都会对应一个小文件,可以把文件已load方式加载进去或者直接把文件放到hdfs文件系统对应的路径里面,前提是创建表的时候,制定好分隔符,然后执行select * from 表,就可以将文件里面的数据读到表中
删除内部表(MANAGED_TABLE)的时候,在 MySQL的元数据表TBLS里面对应的one表内容被删除,另外HDFS文件系统上面的该表的数据都会被删除
2. 外部表
-
外部表没有指定location版本创建时候,会在hdfs文件系统上面创建相应的路径文件夹,相关表的数据都会存在里面,如果是insert into 进去的数据,每一条都会对应一个小文件,可以把文件已load方式加载进去或者直接把文件放到hdfs文件系统对应的路径里面,前提是创建表的时候,制定好分隔符,然后执行select * from 表,就可以将文件里面的数据读到表中
删除时候,对应的hdfs上面的表路径以及数据都不会删除,即使没指定location,自己创建路径的话,还是没有删除。但是在 MySQL的元数据表TBLS里面对应的表内容被删除。 -
创建时候,如果指定了location的话,该外部表对应的存储路径文件夹=location指定的文件夹位置,通过desc formatted tablename和insert into方式插入一条数据会多一个文件在location文件夹下,得到了验证。
删除时候,对应的hdfs上面的表路径以及数据都不会删除,即使没指定location,自己创建路径的话,还是没有删除。但是在 MySQL的元数据表TBLS里面对应的表内容被删除。
3. 内部表和外部表和外部表-location三者异同点
- 内部表和外部表的共同点:
指定好了分隔符的情况下,直接往他们相关的目录下不管是load文件,还是直接hdfs命令上传文件到这个路径,都可以被识别为表数据,而且都会在MySQL元数据TBLS表里面存储,删除表的时候对应的TBLS元数据都被删除。
另外在hdfs文件系统的a数据库文件夹下都有一个one的文件夹,如果a数据库下创建一个内部表one,或者创建一个外部表one指定location为one这个路径,或者创建外部表one不带location,他们三个读出来的数据一样。
- 内部表和外部表不同点:
内部表会把hdfs表相关的文件文件夹全干掉,外部表就不会
- 外部表指定location和没指定location异同点:
指定location的话该表的数据都存储在location下,没指定location的话,数据都存储在当前数据库文件夹下一个名字为该表名的文件夹下,删除表时候hdfs上面数据都不会被删除,但是MySQL的元数据库表TBLS数据都会被删除。