Hive表結構總結
阿新 • • 發佈:2018-12-17
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);