Hive 中内部表与外部表的区别与创建方法

标签: hive 内部 外部 | 发表时间:2014-01-08 17:21 | 作者:skywhsq1987
出处:http://www.iteye.com
先来说下Hive中内部表与外部表的区别:
Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,
不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,
而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。

需要注意的是传统数据库对表数据验证是 schema on write(写时模式),而 Hive 在load时是不检查数据是否
符合schema的,hive 遵循的是 schema on read(读时模式),只有在读的时候hive才检查、解析具体的
数据字段、schema。
读时模式的优势是load data 非常迅速,因为它不需要读取数据进行解析,仅仅进行文件的复制或者移动。
写时模式的优势是提升了查询性能,因为预先解析之后可以对列建立索引,并压缩,但这样也会花费要多的加载时间。

下面来看下 Hive 如何创建内部表:
1 create table test(userid string);
2 LOAD DATA INPATH '/tmp/result/20121213' INTO TABLE test partition(ptDate= '20121213' );
这个很简单,不多说了,下面看下外部表:
01 hadoop fs -ls /tmp/result/20121214
02 Found 2 items
03 -rw-r --r--   3 june supergroup       1240 2012-12-26 17:15 /tmp/result/20121214/part-00000
04 -rw-r --r--   1 june supergroup       1240 2012-12-26 17:58 /tmp/result/20121214/part-00001
05 -- 建表
06 create EXTERNAL table IF NOT EXISTS test (userid string) partitioned by (ptDate string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ;
07 -- 建立分区表,利用分区表的特性加载多个目录下的文件,并且分区字段可以作为where条件,更为重要的是
08 -- 这种加载数据的方式是不会移动数据文件的,这点和 load data 不同,后者会移动数据文件至数据仓库目录。
09 alter table test add partition (ptDate= '20121214' ) location '/tmp/result/20121214' ;
10 -- 注意目录20121214最后不要画蛇添足加 /*,我就是linux shell用多了,加了这玩意,调试了一下午。。。

注意:location后面跟的是目录,不是文件,hive会把整个目录下的文件都加载到表中:

1 create EXTERNAL table IF NOT EXISTS userInfo (id int ,sex string, age int , name string, email string,sd string, ed string)  ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' location '/hive/dw' ;

否则,会报错误:

FAILED: Error in metadata: MetaException(message:Got exception: org.apache.hadoop.ipc.RemoteException java.io.FileNotFoundException: Parent path is not a directory: /hive/dw/record_2013-04-04.txt

最后提下还有一种方式是建表的时候就指定外部表的数据源路径,

但这样的坏处是只能加载一个数据源了:

CREATE EXTERNAL TABLE sunwg_test09(id INT, name string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t’
LOCATION ‘/sunwg/test08′;
上面的语句创建了一张名字为sunwg_test09的外表,该表有id和name两个字段,
字段的分割符为tab,文件的数据文件夹为/sunwg/test08
select * from sunwg_test09;
可以查询到sunwg_test09中的数据。
在当前用户hive的根目录下找不到sunwg_test09文件夹。
此时hive将该表的数据文件信息保存到metadata数据库中。
mysql> select * from TBLS where TBL_NAME=’sunwg_test09′;
可以看到该表的类型为EXTERNAL_TABLE。
mysql> select * from SDS where SD_ID=TBL_ID;
在表SDS中记录了表sunwg_test09的数据文件路径为hdfs://hadoop00:9000/hjl/test08。
# hjl为hive的数据库名

实际上外表不光可以指定hdfs的目录,本地的目录也是可以的。
比如:
CREATE EXTERNAL TABLE test10(id INT, name string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t’

LOCATION ‘file:////home/hjl/sunwg/’;

推荐阅读:

hive中partition如何使用
http://p-x1984.iteye.com/blog/1156408
用正则表达式匹配w3c日志,导入hive
http://essen.iteye.com/blog/1720491
hive中的外表EXTERNAL TABLE

http://www.oratea.net/?p=489

HIVE 数据定义 DDL

http://www.kaixinwenda.com/article-iquicksandi-8522691.html



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [hive 内部 外部] 推荐:

Hive 中内部表与外部表的区别与创建方法

- - 互联网 - ITeye博客
先来说下Hive中内部表与外部表的区别:. Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,. 在删除表的时候,内部表的元数据和数据会被一起删除,. 而外部表只删除元数据,不删除数据. 这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据. 需要注意的是传统数据库对表数据验证是 schema on write(写时模式),而 Hive 在load时是不检查数据是否.

Hive 中内部表与外部表的区别与创建方法

- - 数据库 - ITeye博客
    先来说下Hive中内部表与外部表的区别:. Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,. 在删除表的时候,内部表的元数据和数据会被一起删除,. 而外部表只删除元数据,不删除数据. 这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据.

hive中与hbase外部表join时内存溢出(hive处理mapjoin的优化器机制)

- - CSDN博客云计算推荐文章
与hbase外部表(wizad_mdm_main)进行join出现问题:. 最后在进行到0.83时,内存溢出失败. 默认情况下,Hive会自动将小表加到DistributeCache中,然后在Map扫描大表的时候,去和DistributeCache中的小表做join,这称为Mapjoin. 这里wizad_mdm_main是基于HBase的外部表,而这张表在HDFS上的源路径为 /hivedata/warehouse/wizad.db/wizad_mdm_main,实际这个目录为空,.

hive调优

- - 互联网 - ITeye博客
一、    控制hive任务中的map数: . 1.    通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改);.

hive 优化 tips

- - CSDN博客推荐文章
一、     Hive join优化. 也可以显示声明进行map join:特别适用于小表join大表的时候,SELECT /*+ MAPJOIN(b) */ a.key, a.value FROM a join b on a.key = b.key. 2.     注意带表分区的join, 如:.

Hive中的join

- - CSDN博客云计算推荐文章
select a.* from a join b on a.id = b.id select a.* from a join b on (a.id = b.id and a.department = b.department). 在使用join写查询的时候有一个原则:应该将条目少的表或者子查询放在join操作符的左边.

hive优化(2)

- - 开源软件 - ITeye博客
Hive是将符合SQL语法的字符串解析生成可以在Hadoop上执行的MapReduce的工具. 使用Hive尽量按照分布式计算的一些特点来设计sql,和传统关系型数据库有区别,. 所以需要去掉原有关系型数据库下开发的一些固有思维. 1:尽量尽早地过滤数据,减少每个阶段的数据量,对于分区表要加分区,同时只选择需要使用到的字段.

hive优化

- - 开源软件 - ITeye博客
hive.optimize.cp=true:列裁剪. hive.optimize.prunner:分区裁剪. hive.limit.optimize.enable=true:优化LIMIT n语句. hive.limit.optimize.limit.file=10:最大文件数.   1.job的输入数据大小必须小于参数:hive.exec.mode.local.auto.inputbytes.max(默认128MB).

Hive优化

- - 互联网 - ITeye博客
     使用Hive有一段时间了,目前发现需要进行优化的较多出现在出现join、distinct的情况下,而且一般都是reduce过程较慢.      Reduce过程比较慢的现象又可以分为两类:. 情形一:map已经达到100%,而reduce阶段一直是99%,属于数据倾斜. 情形二:使用了count(distinct)或者group by的操作,现象是reduce有进度但是进度缓慢,31%-32%-34%...一个附带的提示是使用reduce个数很可能是1.

hive bucket 桶

- - CSDN博客推荐文章
对于每一个表(table)或者分区,Hive可以进一步组织成桶. Hive也是针对某一列进行桶的组织. Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中. 采用桶能够带来一些好处,比如JOIN操作. 对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作. 那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量.