hive的四种表

Table内部表、Partition  分区表、ExternalTable 外部表、Bucket  Table 桶表 
一、Table内部表
与数据库中的Table在概念上是类似
每一个Table在Hive中都有一个相应的目录存储数据。例如,一个表test,它在HDFS中的路径为:/

 warehouse/test。warehouse是在hive-site.xml中由${hive.metastore.warehouse.dir}指定的数据仓库的目录
所有的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);


你可能感兴趣的:(hadoop)