hive中的幾種表
阿新 • • 發佈:2018-12-20
1.hive中表的型別
- 內部表(受控表):當刪除內部表的時候,hdfs上的資料以及元資料都會被刪除。
- 外部表:當刪除外部表的時候,HDFS上的資料不會被刪除,但是元資料會被刪除。
- 臨時表(測試環境):在當前會話期間記憶體在,會話結束自動消失,生命週期隨之session。
- 分割槽表:將一批資料分成多個目錄來儲存。
- 分桶表:
2.內部表 ①建立表的方式有三種:
- 直接建立
CREATE TABLE gfstbl( //table前沒有修飾符,說明建立的是一個內部表 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 ':' //map中key和value之間的分隔符 LINES TERMINATED BY '\n'; //行與行之間的分隔符 LOCATION "/test" //可以設定源資料的位置,若不設定預設就在Hive的工作目錄區
- 建立一張表和已存在的一張表的結構相同
create table gfstbl1 like gfstbl //只會建立表結構
- 建立一張表和已存在的一張表的結構相同,並且還可以帶有資料
create table gfstbl2 AS SELECT id,name,gfs,address from gfstbl; //會建立相應的表
結構,並且插入資料。查哪個欄位就會插入哪個欄位的資料。
②查看錶描述資訊
DESCRIBE [EXTENDED|FORMATTED] table_name
EXTENDED極簡的方式顯示(預設就是極簡的方式)
FORMATTED格式化方式來顯示
③插入資料的方式
1、insert 新資料
2、load
3、查詢其他表資料 insert 到新表中
模板:
insert into rest select count(*) from table;
習慣寫法 from提前 減少SQL程式碼的冗餘
from day_hour_table
insert into rest
select count(*) ;
④查詢表中欄位的值
- 欄位型別為陣列,採用 欄位名[下標]來獲取。
- 欄位型別為map,採用 欄位名[“map的key”]來獲取。
- 欄位型別為STRUCT,採用 欄位名.STRUCT的屬性來獲取。
3.臨時表 ①建立臨時表(臨時表不支援分割槽)
create TEMPORARY table ttabc(id Int,name String) //TEMPORARY代表這是一個臨時表。
②shell 凡是shell都遵循repl機制。 r :read 讀 e:evaluate 計算 p:print 列印 l :loop 迴圈 ③使用yarn命令幹掉某一個application
yarn application -kill job_1540028621068_0006 // id是在job啟動時就給出了。
④臨時表也是一個內部表,操作和內部表一樣。 4.外部表 ①建立外部表
create external table wc_external //external代表這是一個外部表
(word1 STRING,
word2 STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
location '/test/external'; location可加可不加,不加location預設是在hive的工作目錄區
②往表中新增資料
1、將按照wc_external表的規則 建立了一個新的檔案
hello bj
hello sh
將這個問題拷貝到這個表的工作目錄區中,然後查詢這個表資料量增多
2、load data inpath "/test/external/t" into table wc_external;
將工作目錄區中檔案再次新增到這個表中,發現數據量沒有增量
3、將檔案上傳到了hdfs的/根目錄
load data inpath "/t" into table wc_external;
資料量增多了,但是/t檔案被剪貼了
5.分割槽表 ①為什麼建立分割槽表? 為了防止暴力掃描全表。可以提高查詢效率。 ②靜態分割槽表 建立單分割槽表
create table day_table (id int, content string)
partitioned by (dt string) //指定分割槽
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ;
操作單分割槽表
insert單條插入的方式往分割槽表中插入資料:
insert into day_table partition (dt = "9-26") values(1,"anb");
load批量插入的方式往分割槽表中插入資料:
load data local inpath "/root/ceshi" into table day_table partition (dt="9-27");
刪除Hive分割槽表中的分割槽
ALTER TABLE day_table DROP PARTITION (dt="9-27");
建立多分割槽表
create table day_hour_table (id int, content string)
partitioned by (dt int,hour int) //指定多個分割槽
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ;
操作多分割槽表
載入資料:
insert單條插入的方式往分割槽表中插入資料:
insert into day_hour_table partition(dt=9,hour=1) values(1,"a2 bc");
insert into day_hour_table partition(dt=9,hour=2) values(3,"a2 bc");
insert into day_hour_table partition(dt=8,hour=1) values(3,"a2 bc");
insert into day_hour_table partition(dt=8,hour=2) values(3,"a2 bc");
load批量插入的方式往分割槽表中插入資料:
load data local inpath "/root/ceshi" into table day_table partition (dt=10,hour=10);
刪除Hive分割槽表中的分割槽
ALTER TABLE day_table DROP PARTITION (dt=10,hour=10);
建立/新增分割槽
建立一個空分割槽:ALTER TABLE day_hour_table ADD PARTITION (dt=10000, hour=2000);
然後將資料上傳到空分割槽對應的目錄下,分割槽表中就會顯示資料
建立一個空分割槽並且將空分割槽指向資料位置:
ALTER TABLE day_hour_table ADD PARTITION (dt=10000, hour=2000) location "/test"
往分割槽中新增資料的五種方式
(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)建立分割槽,並且指定分割槽資料的位置
③動態分割槽表 動態分割槽表的概念
靜態分割槽表,一個檔案資料只能匯入到某一個分割槽中,並且分割槽是使用者指定的,這種方式
不夠靈活,業務場景比較侷限。動態分割槽可以根據資料本身的特徵自動來劃分分割槽,比如
我們可以指定按照資料中的年齡、性別來動態分割槽。使用動態分割槽表,要修改兩個配置資訊
set hive.exec.dynamic.partition=true; //開啟動態分割槽
set hive.exec.dynamic.partition.mode=nostrict; //使用非嚴格模式。嚴格模式是指必須要有一個靜態分割槽
建立動態分割槽表
建立動態分割槽表的語句與建立靜態分割槽表的語句是一模一樣的,只是在指定分割槽的時候用表中的欄位來指定。
partitioned by (sex string,age INT)
往動態分割槽表中載入資料
往動態分割槽表中載入資料不能使用 load data 。load data只是將資料上傳到HDFS指定目錄中。
我們之前使用load data往分割槽表匯入資料的時候,都是要指定partition分割槽的,這樣他才會知
道將資料上傳到HDFS的哪一個分割槽。
但是如果我們還是採用load data指定分割槽的話,那就不是動態分割槽表,還依然是靜態分割槽表
所以得采用 from insert的方式往動態分割槽表中插入資料。
④檢視分割槽數
show partitions table_name //動態,靜態都可以檢視
6.分桶表 ①分桶表的原理
分桶表是對列值取雜湊值的方式,將不同資料放到不同檔案中儲存,一個檔案對應一個桶
由列的雜湊值除以桶的個數來決定每條資料劃分在哪個桶中
對於hive中每一個表、分割槽都可以進一步進行分桶。
好處:提高了join的效率;提高了隨機抽樣的效率。
使用分桶表要修改set hive.enforce.bucketing=true;
②建立分桶表
CREATE TABLE psnbucket( id INT, name STRING, age INT)
CLUSTERED BY (age) INTO 4 BUCKETS // 指定按照age的雜湊值與4取模來分桶
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
③往分桶表中插入資料
不能使用load data,只能使用insert
④抽樣
select * from psnbucket tablesample(bucket X out of Y on age);
X代表從哪個桶開始抽取資料
Y必須為該表總桶數的倍數或因子,表示步長,