刚接触Hive,之前建表都是 external 表,这种表就是基于有外部.csv数据文件的,只要在建表时指明location,然后再将数据文件放到该路径就OK,今天建了一张普通表,发现这里面的数据不正常,我用select * from table_name没有数据,但是select count(*)明明有300行数据,从头检查到尾,发现我建普通表的时候,竟然加上了location!
我是这样写的(错误的)
create table mxla(
bill_id string,
caller string,
called string,
)
location='/tmp/mxl/test';
应该这样写
create table mxla(
bill_id string,
caller string,
called string,
);
问题解决!
顺便分享一下我理解的外部表和普通表的区别:
Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,
不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,
而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。