Table内部表、Partition 分区表、ExternalTable 外部表、Bucket Table 桶表
一、Table内部表
与数据库中的Table在概念上是类似
每一个Table在Hive中都有一个相应的目录存储数据。例如,一个表test,它在HDFS中的路径为:/
所有的Table数据(不包括ExternalTable)都保存在这个目录中。
删除表时,元数据与数据都会被删除
创建数据文件inner_table.dat
创建表
hive>createtable inner_table (key string);
加载数据
hive>loaddata local inpath '/root/inner_table.dat' into table inner_table;
查看数据
select* from inner_table
selectcount(*) from inner_table
删除表 drop table inner_table
二、Partition 分区表 Partition 对应于数据库的 Partition 列的密集索引
在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都存储在对应的目录中
例如:test表中包含date和city两个Partition,
则对应于date=20130201,city = bj的HDFS子目录为:
/warehouse/test/date=20130201/city=bj
对应于date=20130202,city=sh的HDFS子目录为;
/warehouse/test/date=20130202/city=sh
CREATETABLEtmp_table #表名
(
title string,#字段名称字段类型
minimum_bid double,
quantity bigint,
have_invoice bigint
)COMMENT'注释:XXX'#表注释
PARTITIONED BY(ptSTRING)#分区表字段(如果你文件非常之大的话,采用分区表可以快过滤出按分区字 段 划分的数据) ROW FORMAT DELIMITED
FIELDSTERMINATED BY'\001' # 字段是用什么分割开的
STOREDASSEQUENCEFILE; #用哪种方式存储数据,SEQUENCEFILE是hadoop自带的文件压
一些相关命令
SHOWTABLES; #查看所有的表
SHOWTABLES'*TMP*'; #支持模糊查询
SHOW PARTITIONS TMP_TABLE; #查看表有哪些分区DESCRIBETMP_TABLE; #查看表结构
三、ExternalTable 外部表
指向已经在HDFS中存在的数据,可以创建Partition
它和 内部表 在元数据的组织上是相同的,而实际数据的存储则有较大的差异
内部表的创建过程和数据加载过程(这两个过程可以在同一个语句中完成),在加载数据的过程中,实际数据 会被移动到数据仓库目录中;之后对数据对访问将会直接在数据仓库目录中完成。删除表时,表中的数据和元数 将会被同时删除
外部表只有一个过程,加载数据和创建表同时完成,并不会移动到数据仓库目录中,只是与外部数据建立一个
链接。当删除一个 外部表 时,仅删除该链接
创建数据文件external_table.dat
创建表
hive>createexternal table external_table1 (key string) ROW FORMAT DELIMITED FIELDSTERMINATED
BY '\t' location '/home/external';
在HDFS创建目录/home/external
#hadoopfs -put /home/external_table.dat /home/external
加载数据
LOADDATA INPATH '/home/external_table1.dat' INTO TABLE external_table1;
查看数据
select* from external_table
selectcount(*) from external_table
删除表
droptable external_table
四、Bucket Table 桶表
桶表是对数据进行哈希取值,然后放到不同文件中存储。
创建表
createtable bucket_table(id string) clustered by(id) into 4 buckets;
加载数据
sethive.enforce.bucketing = true;
insertinto table bucket_table select name from stu;
insertoverwrite table bucket_table select name from stu;
数据加载到桶表时,会对字段取hash值,然后与桶的数量取模。把数据放到对应的文件中。
抽样查询
select* from bucket_table tablesample(bucket 1 out of 4 on id);