内部表:
平时创建的普通表即为内部表
语句:
create table `test1` (
id string ,
name string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;
外部表:
带external关键字的为外部表
语句:
create external table `test_external` (
id string,
name string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;
其实不管是内部表还是外部表都可以加location关键字指定hive表的存储路径,当然也可以不加,从这点看是没有区别的。
如果不加location那么不管是内部表还是外部表都会在默认的hive配置的hdfs路径下下新建一个和表名相同的文件夹。
如果加了location指定另外的文件夹,那么在查询时,该文件夹下对应的数据会加载到hive表里。
注:一般很少用insert (不是insert overwrite)语句,因为就算就算插入一条数据,也会调用MapReduce,这里我们选择Load Data的方式。
区别总结:
1、在导入数据到外部表,数据并没有移动到自己的数据仓库目录下(如果指定了location的话),也就是说外部表中的数据并不是由它自己来管理的!而内部表则不一样;
2、在删除内部表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的!
3. 在创建内部表或外部表时加上location 的效果是一样的,只不过表目录的位置不同而已,加上partition用法也一样,只不过表目录下会有分区目录而已,load data local inpath直接把本地文件系统的数据上传到hdfs上,有location上传到location指定的位置上,没有的话上传到hive默认配置的数据仓库中。
外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。