1. 程式人生 > >hive中的幾種表

hive中的幾種表

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必須為該表總桶數的倍數或因子,表示步長,