hive 創建/刪除/截斷 表(翻譯自Hive wiki)


這里羅列常用操作,更多參考 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-Create%2FDrop%2FTruncateTable

 

簡單的創建表

create table table_name (
  id                int,
  dtDontQuery       string,
  name              string
)

 

 

創建有分區的表

create table table_name (
  id                int,
  dtDontQuery       string,
  name              string
)
partitioned by (date string)

一個表可以擁有一個或者多個分區,每個分區以文件夾的形式單獨存在表文件夾的目錄下。

分區是以字段的形式在表結構中存在,通過describe table命令可以查看到字段存在,但是該字段不存放實際的數據內容,僅僅是分區的表示。

在Hive Select查詢中一般會掃描整個表內容,會消耗很多時間做沒必要的工作。有時候只需要掃描表中關心的一部分數據,因此建表時引入了partition概念。表中的一個 Partition 對應於表下的一個目錄,Partition 就是輔助查詢,縮小查詢范圍,加快數據的檢索速度和對數據按照一定的規格和條件進行管理。

 

典型的默認創建表

CREATE TABLE page_view(
     viewTime INT, 
     userid BIGINT,
     page_url STRING, 
     referrer_url STRING,
     ip STRING COMMENT 'IP Address of the User')
 COMMENT 'This is the page view table'
 PARTITIONED BY(dt STRING, country STRING)
 ROW FORMAT DELIMITED
   FIELDS TERMINATED BY '\001'
   COLLECTION ITEMS TERMINATED BY '\002'
   MAP KEYS TERMINATED BY '\003'
 STORED AS TEXTFILE;

 

這里創建了表page_view,有表的注釋,一個字段ip的注釋,分區有兩列,分別是dt和country。

[ROW FORMAT DELIMITED]關鍵字,是用來設置創建的表在加載數據的時候,支持的列分隔符。不同列之間用一個'\001'分割,集合(例如array,map)的元素之間以'\002'隔開,map中key和value用'\003'分割。

 

[STORED AS file_format]關鍵字是用來設置加載數據的數據類型,默認是TEXTFILE,如果文件數據是純文本,就是使用 [STORED AS TEXTFILE],然后從本地直接拷貝到HDFS上,hive直接可以識別數據。

 

常用的創建表

CREATE TABLE login(
     userid BIGINT,
     ip STRING, 
     time BIGINT)
 PARTITIONED BY(dt STRING)
 ROW FORMAT DELIMITED
   FIELDS TERMINATED BY '\t'
 STORED AS TEXTFILE;

 

創建外部表

如果數據已經存在HDFS的'/user/hadoop/warehouse/page_view'上了,如果想創建表,指向這個路徑,就需要創建外部表:

CREATE EXTERNAL TABLE page_view(
     viewTime INT, 
     userid BIGINT,
     page_url STRING, 
     referrer_url STRING,
     ip STRING COMMENT 'IP Address of the User',
     country STRING COMMENT 'country of origination')
 COMMENT 'This is the staging page view table'
 ROW FORMAT DELIMITED FIELDS TERMINATED BY '\054'
 STORED AS TEXTFILE
 LOCATION '/user/hadoop/warehouse/page_view';

創建表,有指定EXTERNAL就是外部表,沒有指定就是內部表,內部表在drop的時候會從HDFS上刪除數據,而外部表不會刪除。

外部表和內部表一樣,都可以有分區,如果指定了分區,那外部表建了之后,還要修改表添加分區。

外部表如果有分區,還可以加載數據,覆蓋分區數據,但是外部表刪除分區,對應分區的數據不會從HDFS上刪除,而內部表會刪除分區數據。

 

指定數據庫創建表

如果不指定數據庫,hive會把表創建在default數據庫下,假設有一個hive的數據庫mydb,要創建表到mydb,如下:

CREATE TABLE mydb.pokes(foo INT,bar STRING);

或者是

use mydb; --把當前數據庫指向mydb
CREATE TABLE pokes(foo INT,bar STRING);

 

復制表結構

CREATE TABLE empty_table_name LIKE table_name;

根據table_name創建一個空表empty_table_name,empty_table_name沒有任何數據。

 

create-table-as-selectt (CTAS)

CTAS創建的表是原子性的,這意味着,該表直到所有的查詢結果完成后,其他用戶才可以看到完整的查詢結果表。

CTAS唯一的限制是目標表,不能是一個有分區的表,也不能是外部表。

簡單的方式

CREATE TABLE new_key_value_store
  AS 
SELECT (key % 1024) new_key, concat(key, value) key_value_pair FROM key_value_store;

復雜的方式

CREATE TABLE new_key_value_store
   ROW FORMAT SERDE "org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe"
   STORED AS RCFile AS
SELECT (key % 1024) new_key, concat(key, value) key_value_pair
FROM key_value_store
SORT BY new_key, key_value_pair;

 

刪除表

DROP TABLE table_name;
DROP TABLE IF EXISTS table_name;

刪除表會移除表的元數據和數據,而HDFS上的數據,如果配置了Trash,會移到.Trash/Current目錄下。

刪除外部表時,表中的數據不會被刪除。

 

截斷表

TRUNCATE TABLE table_name;
TRUNCATE TABLE table_name PARTITION (dt='20080808');

從表或者表分區刪除所有行,不指定分區,將截斷表中的所有分區,也可以一次指定多個分區,截斷多個分區。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM