文档介绍:这个很简单,不多说了,下面看下外部表:1、Hive内部表与外部表的区别?先来说下Hive中内部表与外部表的区别:Hive创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。需要注意的是传统数据库对表数据验证是schemaonwrite(写时模式),而Hive在load时是不检查数据是否符合schema的,hive遵循的是schemaonread(读时模式),只有在读的时候hive才检查、解析具体的数据字段、schema。读时模式的优势是loaddata非常迅速,因为它不需要读取数据进行解析,仅仅进行文件的复制或者移动。写时模式的优势是提升了查询性能,因为预先解析之后可以对列建立索引,并压缩,但这样也会花费要多的加载时间。下面来看下Hive如何创建内部表:createtabletest(useridstring);LOADDATAINPATH'/tmp/result/20121213'INTOTABLEtestpartition(ptDate='20121213');hadoopfs-ls/tmp/result/20121214Found2items-rw-r--r--3junesupergroup12402012-12-2617:15/tmp/result/20121214/part-00000-rw-r--r--1junesupergroup12402012-12-2617:58/tmp/result/20121214/part-00001--建表createEXTERNALtableIFNOTEXISTStest(useridstring)partitionedby(ptDatestring)ROWFORMATDELIMITEDFIELDSTERMINATEDBY'\t';--建立分区表,利用分区表的特性加载多个目录下的文件,并且分区字段可以作为where条件,更为重要的是--这种加载数据的方式是不会移动数据文件的,这点和loaddata不同,后者会移动数据文件至数据仓库目录。altertabletestaddpartition(ptDate='20121214')location'/tmp/result/20121214';--注意目录20121214最后不要画蛇添足加/*,我就是linuxshell用多了,加了这玩意,调试了一下午。。。注意:location后面跟的是目录,不是文件,hive会把整个目录下的文件都加载到表中:1createEXTERNALtableIFNOTEXISTSuserInfo(idint,sexstring,ageint,namestring,emailstring,sdstring,edstring)ROWFORMATDELIMITEDFIELDSTERMINATEDBY'\t'location'/hive/dw';否则,会报错误:FAILED:Errorinmetadata:MetaException(message:.:Parentpathisnotadirectory:/hive/dw/record_2013-04-,但这样的坏处是只能加载一个数据源了:CREATEEXTERNALTABLEsunwg_test09(idINT,namestring)ROWFORMATDELIMITEDFIELDSTERMINATEDBY‘\t’LOCATION‘/sunwg/test08′;上面的语句创建了一张名字为sunwg_test09的外表,该表有id和name两个字段,字段的分割符为tab,文件的数据文件夹为/sunwg/test08select*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://hadoop00:9000/hjl/test08。