文档介绍:Hive内部表与外部表的区别?先来说下Hive中内部表与外部表的区别: Hive创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。 需要注意的是传统数据库对表数据验证是schemaonwrite(写时模式),而Hive在load时是不检查数据是否 符合schema的,hive遵循的是schemaonread(读时模式),只有在读的时候hive才检查、解析具体的 数据字段、schema。 读时模式的优势是loaddata非常迅速,因为它不需要读取数据进行解析,仅仅进行文件的复制或者移动。 写时模式的优势是提升了查询性能,因为预先解析之后可以对列建立索引,并压缩,但这样也会花费要多的加载时间。 下面来看下Hive如何创建内部表: 1create table test(useridstring);2LOAD DATAINPATH '/tmp/result/' INTO TABLE testpartition(ptDate='');这个很简单,不多说了,下面看下外部表: 01hadoopfs-ls/tmp/result/02Found2items03-rw-r--r--  3junesupergroup      12402012-12-2617:15/tmp/result//part-0000004-rw-r--r--  1junesupergroup      12402012-12-2617:58/tmp/result//part-0000105--建表06create EXTERNAL table IF NOT EXISTStest(useridstring)partitioned by (ptDatestring)ROWFORMATDELIMITEDFIELDSTERMINATED BY '\t';07--建立分区表,利用分区表的特性加载多个目录下的文件,并且分区字段可以作为where条件,更为重要的是08--这种加载数据的方式是不会移动数据文件的,这点和loaddata不同,后者会移动数据文件至数据仓库目录。09alter table test add partition(ptDate='')location '/tmp/result/';--注意目录最后不要画蛇添足加/*,我就是linuxshell用多了,加了这玩意,调试了一下午。。。注意:location后面跟的是目录,不是文件,hive会把整个目录下的文件都加载到表中:1create EXTERNAL table IF NOT EXISTSuserInfo(id int,sexstring,age int, name string,emailstring,sdstring,edstring) ROWFORMATDELIMITEDFIELDSTERMINATED BY '\t' location '/hive/dw';否则,会报错误:FAILED:Errorinmetadata:MetaException(message:.:Parentpathisnotadirectory:/hive/dw/record_2013-04-,但这样的坏处是只能加载一个数据源了:CREATEEXTERNALTABLEsunwg_test09(idINT,namestring) ROWFORMATDELIMITED FIELDSTERMINATEDBY‘\t’ LOCATION‘/sunwg/test08′; 上面的语句创建了一张名字为sunwg_test09的外表,该表有id和name两个字段, 字段的分割符为tab,文件的数据文件夹为/sunwg/test08 select*fromsunwg_test09; 可以查询到sunwg_test09中的数据。 在当前用户hive的根目录下找不到sunwg_test09文件夹。 此时hive将该表的数据文件信息保存到metadata数据库中。 mysql>select*fromTBLSwhereTBL_NAME=’sunwg_test09′; 可以看到该表的类型为EXTERNAL_TABLE。 mysql>select*fromSDSwhereSD_ID=TBL_ID; 在表SDS中记录了表sunwg_test09的数据文件路径为hdfs:/