天天看点

[hive] 关于内部表和外部表区别的误区

网上相当一部分博客如此描述内外部表的区别

创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。

删除表时:在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。

创建表时数据会不会移动取决于以下两点

1 数据来源是本地还是hdfs

若是本地一定不会移动(相当于copy),若是hdfs的文件则可能会移动(相当于剪切)

2 有没有指定location

内部表可以指定location,外部表也可以不指定location.外部表数据位置之所以没有变得是因为由location指向了数据原本存放的位置,如果对内部表做同样的设置,效果也是相同的.

当没有指定location时,不管内部表还是外部表都会在默认位置创建表目录.

因为创建外部表时往往会主动将外部表的location定位至数据所在位置,所以有"创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变"的表象产生.

删除表时有一点可以补充,truncate关键字只能删除内部表中的数据,而不能删除外部表中的数据.

继续阅读