Hive表結構總結

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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章