其次,Hive 中所有的数据都存储在 HDFS 中,Hive 中包含以下数据模型:
Table,External Table,Partition,Bucket。
1. Hive 中的 Table 和数据库中的 Table 在概念上是类似的,每一个
Table 在 Hive 中都有一个相应的目录存储数据。例如,一个表 pvs,它
在 HDFS 中的路径为:/wh/pvs,其中,wh 是在 hive-site.xml 中由
${hive.metastore.warehouse.dir} 指定的数据仓库的目录,所有的
Table 数据(不包括 External Table)都保存在这个目录中。
2. Partition 对应于数据库中的 Partition 列的密集索引,但是 Hive 中
Partition 的组织方式和数据库中的很不相同。在 Hive 中,表中的一个
Partition 对应于表下的一个目录,所有的 Partition 的数据都存储在对
应的目录中。例如:pvs 表中包含 ds 和 city 两个 Partition,则对应
于 ds = 20090801, ctry = US 的 HDFS 子目录为:
/wh/pvs/ds=20090801/ctry=US;对应于 ds = 20090801, ctry
= CA 的 HDFS 子目录为;/wh/pvs/ds=20090801/ctry=CA
3. Buckets 对指定列计算 hash,根据 hash 值切分数据,目的是为了并
行,每一个 Bucket 对应一个文件。将 user 列分散至 32 个
bucket,首先对 user 列的值计算 hash,对应 hash 值为 0 的
HDFS 目录为:/wh/pvs/ds=20090801/ctry=US/part-00000;
hash 值为 20 的 HDFS 目录为:
/wh/pvs/ds=20090801/ctry=US/part-00020
4. External Table 指向已经在 HDFS 中存在的数据,可以创建 Partition。
它和 Table 在元数据的组织上是相同的,而实际数据的存储则有较大的
差异。
� Table 的创建过程和数据加载过程(这两个过程可以在同一个语句中完
成),在加载数据的过程中,实际数据会被移动到数据仓库目录中;之后
对数据对访问将会直接在数 据仓库目录中完成。删除表时,表中的数据
和元数据将会被同时删除。
� External Table 只有一个过程,加载数据和创建表同时完成(CREATE
EXTERNAL TABLE ……LOCATION),实际数据是存储在 LOCATION
后面指定的 HDFS 路径中,并不会移动到数据仓库目录中。当删除一个
External Table 时,仅删除
摘要:由于 Hive 采用了 SQL 的查询语言 HQL,因此很容易将 Hive 理解为
数据库。其实
从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。本文
将
从多个方面来阐述 Hive 和数据库的差异。数据库可以用在 Online 的应用中,
但是
Hive 是为数据仓库而设计的,清楚这一点,有助于从应用角度理解 Hive 的特
性。