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);