Hive五种表结构特性

1,内部表:当删除内部表时,HDFS上的数据以及元数据都会被删除
2,外部表:但删除外部表时,HDFS上的源数据不会被删除但元数据会被删除
3,临时表:在当前会话期间存在,会话结束时自动消失。
4,分区表:将一批数据按照一定的字段或关键字分为多个目录进行存储
5,分桶表:将一批数据按照指定好的字段和桶的数量,对指定字段的数据取模运算,分成不同的桶进行存储,方便随机取样以及join等操作。

建表操作

内部表

创建语句

CREATE TABLE gfstbl(
  id INT,
  name STRING,
  age INT,
  gfs ARRAY<STRING>,
  address MAP<STRING,STRING>,
  info STRUCT<country:String,province:String,shi:String>
)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ' ' 
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':' 
LINES TERMINATED BY '\n'
LOCATION "/test";//可以设置源数据的位置,若不设置默认就在Hive的工作目录区

ROW FORMAT是设置行的格式,方便通过load加载数据

加载数据

load data local inpath '/root/gfs.txt' into table gfstbl;

查看表详细信息

DESCRIBE [EXTENDED|FORMATTED] table_name
EXTENDED极简的方式显示
FORMATTED格式化方式来显示
DESCRIBE EXTENDED gfstbl;默认就是EXTENDED
DESCRIBE FORMATTED gfstbl;

创建表方式二

create table gfstbl1 like gfstbl;只是创建表结构

创建表方式三

create table gfstbl2 AS SELECT id,name,gfs,address from gfstbl;  
会创建相应的表结构,并且插入数据

外部表

create external table wc_external 
   (word1 STRING, 
   word2 STRING) 
   ROW FORMAT DELIMITED 
   FIELDS TERMINATED BY ' ' 
   location '/test/external'; location可加可不加,不加location默认是在hive的工作目录区

临时表

create TEMPORARY table ttabc(id Int,name String) 
//临时表的声明周期是一次会话
进入hive shell 创建一张表,关闭shell后,表丢失

create TEMPORARY table ttabc(id Int,name String) partitioned by (dt String);
临时表不支持分区
Partition columns are not supported on temporary tables

分区表

create table day_table (id int, content string) 
partitioned by (dt string)
 ROW FORMAT DELIMITED 
 FIELDS TERMINATED BY '\t' ;

分桶表

CREATE TABLE psnbucket( id INT, name STRING, age INT) 
CLUSTERED BY (age) INTO 4 BUCKETS 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

总结插入数据到分区表的四种方式

(1)insert 指定分区
(2)load data 指定分区
(3)查询已有表的数据,insert到新表中

from day_hour_table insert into table newt partition(dt=01,hour=9898) select id,content

(4)alter table add partition创建空分区,然后使用HDFS命令往空分区目录中上传数据
(5)创建分区,并且指定分区数据的位置

分桶表实例

文件1 文件2
举例:找到相同的URL

分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储
由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中
对于hive中每一个表、分区都可以进一步进行分桶

应用场景:随机、join

样例数据:
1,tom,11,189
2,cat,22,189
3,dog,33,189
4,hive,44,189
5,hbase,55,189
6,mr,66,188
7,alice,77,188
8,scala,88,188

原始表:
CREATE TABLE original( id INT, name STRING, age INT,height DOUBLE)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
加载数据至原始表中:
LOAD DATA LOCAL INPATH "/root/bucketData" into table original;

分桶表:
CREATE TABLE psnbucket( id INT, name STRING, age INT) 
CLUSTERED BY (age) INTO 4 BUCKETS 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
插入数据:
insert into table psnbucket select id, name, age from original;
每一个小文件对应一个桶
抽样:	
select * from psnbucket tablesample(bucket 1 out of 4 on age);

分桶表+分区表:
CREATE TABLE psnbucket_partition( id INT, name STRING, age INT) 
PARTITIONED BY(height DOUBLE) 
CLUSTERED BY (age) INTO 4 BUCKETS 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
插入数据:
insert into table psnbucket_partition partition(height) select id, name, age,height from original;
多个分区中的对应的位置的小文件组成一个桶

抽样:
select * from psnbucket tablesample(bucket 1 out of 4 on age);