1. 程式人生 > 其它 >Hive 基礎(2):庫、表、欄位、互動式查詢的基本操作

Hive 基礎(2):庫、表、欄位、互動式查詢的基本操作

1、命令列操作

(1)列印查詢頭,需要顯示設定:

set hive.cli.print.header=true; (2)加"--",其後的都被認為是註釋,但 CLI 不解析註釋。帶有註釋的檔案只能通過這種方式執行: hive -f script_name (3)-e後跟帶引號的hive指令或者查詢,-S去掉多餘的輸出: hive -S -e "select * FROM mytable LIMIT 3" > /tmp/myquery (4)遍歷所有分割槽的查詢將產生一個巨大的MapReduce作業,如果你的資料集和目錄非常多, 因此建議你使用strict模型,也就是你存在分割槽時,必須指定where語句

hive> set hive.mapred.mode=strict;

(5)顯示當前使用資料庫 set hive.cli.print.current.db=true;

(6)設定 Hive Job 優先順序

set mapred.job.priority=VERY_HIGH | HIGH | NORMAL | LOW | VERY_LOW

(VERY_LOW=1,LOW=2500,NORMAL=5000,HIGH=7500,VERY_HIGH=10000) set mapred.job.map.capacity=M設定同時最多執行M個map任務 set mapred.job.reduce.capacity=N設定同時最多執行N個reduce任務 (7)Hive 中的Mapper個數的是由以下幾個引數確定的: mapred.min.split.size ,mapred.max.split.size ,dfs.block.size splitSize = Math.max(minSize, Math.min(maxSize, blockSize)); map個數還與inputfilles的個數有關,如果有2個輸入檔案,即使總大小小於blocksize,也會產生2個map mapred.reduce.tasks用來設定reduce個數。

2、表操作

(1)檢視某個表所有分割槽 SHOW PARTITIONS ext_trackflow 查詢具體某個分割槽 SHOW PARTITIONS ext_trackflow PARTITION(statDate='20140529'); (2)檢視格式化的完整表結構 desc formatted ext_trackflow; DESCRIBE EXTENDED ext_trackflow; (3)刪除分割槽:分割槽的元資料和資料將被一併刪除,但是對於擴充套件表則只刪除元資料 ALTER TABLE ext_trackflow DROP PARTITION (statDate='20140529'); (4)查詢是外部表還是內部表 DESCRIBE EXTENDED tablename (5)複製表結構 CREATE EXTERNAL TABLE IF NOT EXISTS mydb.employees3  LIKE mydb.employees  LOCATION '/path/to/data'; Note:如果你忽略關鍵字EXTERNAL,那麼將依據 employees 是外部還是內部,如果加了那麼一定是EXTERNAL,並要LOCATION (6)為內部表某個分割槽匯入資料,Hive將建立目錄並拷貝資料到分割槽當中 LOAD DATA LOCAL INPATH '${env:HOME}/california-employees' INTO TABLE employees PARTITION (country = 'US', state = 'CA'); (7)為外部表某個分割槽新增資料 ALTER TABLE log_messages ADD  IF NOT EXISTS PARTITION(year = 2012, month = 1, day = 2) LOCATION 'hdfs://master_server/data/log_messages/2012/01/02'; Note:Hive並不關心分割槽,目錄是否存在,是否有資料,這會導致沒有查詢結果 (8)修改表:在任何時候你都可以修改表,但是你僅僅修改的是表的元資料,都實際資料不會造成任何影響 例如更改分割槽指定位置,這個命令不會刪除舊的資料 ALTER TABLE log_messages PARTITION(year = 2011, month = 12, day = 2)

SET LOCATION 's3n://ourbucket/logs/2011/01/02';

(9)更改表屬性 ALTER TABLE log_messages SET TBLPROPERTIES ( 'notes' = 'The process id is no longer captured; this column is always NULL' ); (10)更改儲存屬性 ALTER TABLE log_messages PARTITION(year = 2012, month = 1, day = 1) SET FILEFORMAT SEQUENCEFILE; Note:如果table是分割槽的話那麼partition是必須的 (11)指定新的 SerDe ALTER TABLE table_using_JSON_storage SET SERDE 'com.example.JSONSerDe' WITH SERDEPROPERTIES ( 'prop1' = 'value1', 'prop2' = 'value2' ); Note:SERDEPROPERTIE解釋SERDE用的何種模型,屬性值和名稱都為字串,方便告訴使用者,為自己指定SERDE並且應用於什麼模型 為當前SERDE設定 ALTER TABLE table_using_JSON_storage SET SERDEPROPERTIES ( 'prop3' = 'value3', 'prop4' = 'value4' ); (12)改變儲存屬性 ALTER TABLE stocks CLUSTERED BY (exchange, symbol) SORTED BY (symbol) INTO 48 BUCKETS; (13)複雜更改表語句:為各種不同的操作新增 hook ALTER TABLE … TOUCH ALTER TABLE log_messages TOUCH PARTITION(year = 2012, month = 1, day = 1); 典型的應用場景就是當分割槽有改動的時候,那麼將觸發 hive -e 'ALTER TABLE log_messages TOUCH PARTITION(year = 2012, month = 1, day = 1);' (14)ALTER TABLE … ARCHIVE PARTITION 捕獲分割槽檔案到Hadoop archive file也就是HAR ALTER TABLE log_messages ARCHIVE PARTITION(year = 2012, month = 1, day = 1);(只可以用在被分割槽的表) (15)保護分割槽不被刪除和查詢 ALTER TABLE log_messages PARTITION(year = 2012, month = 1, day = 1) ENABLE NO_DROP; ALTER TABLE log_messages PARTITION(year = 2012, month = 1, day = 1) ENABLE OFFLINE; Note:與ENABLE對應的是DISABLE,不能應用在未被分割槽的表

(16)按正條件(正則表示式)顯示錶

hive> SHOW TABLES '.*s';

(17)外部表、內部表互轉

alter table tablePartition set TBLPROPERTIES ('EXTERNAL'='TRUE');  //內部錶轉外部表  alter table tablePartition set TBLPROPERTIES ('EXTERNAL'='FALSE');  //外部錶轉內部表 

(18)分割槽與分桶:

partition(分割槽:按目錄儲存檔案,每個partition對應一個目錄)例如:

CREATE EXTERNAL TABLE table1 (
    column1           STRING,
    column2          STRING,
    column3           STRING,
)
PARTITIONED BY (dt STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
STORED AS TEXTFILE;
ALTER TABLE table1 ADD IF NOT EXISTS PARTITION (dt=20090105);
ALTER TABLE table1 ADD IF NOT EXISTS PARTITION (dt=20090102);
ALTER TABLE table1 ADD IF NOT EXISTS PARTITION (dt=20081231);

bucket(分桶,對指定列作hash,每個bucket對應一個檔案)

CREATE TABLE VT_NEW_DATA
(
    column1           STRING,
    column2          STRING,
    column3           STRING,
)
CLUSTERED BY (column1)
SORTED BY (column1)
INTO 48 BUCKETS
ROW FORMAT DELIMITED
  FIELDS TERMINATED BY '|'
  LINES TERMINATED BY 'n'
STORED AS RCFILE;

3、列操作

(1)重新命名列,更改位置,型別和註釋 ALTER TABLE log_messages CHANGE COLUMN hms hours_minutes_seconds INT COMMENT 'The hours, minutes, and seconds part of the timestamp' AFTER severity; 更改名稱: new column old column type comment不是必須的,你可以添加註釋 AFTER用於更改欄位位置 僅修改了元資料並未對源data做任何改動 (2)新增新列 ALTER TABLE log_messages ADD COLUMNS ( app_name STRING COMMENT 'Application name', session_id LONG COMMENT 'The current session id'); (3)刪除和替換列:慎用!!! ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...) ADD是代表新增一欄位,欄位位置在所有列後面(partition列前) REPLACE則是表示替換表中所有欄位。 REPLACE COLUMNS removes all existing columns and adds the new set of columns.  REPLACE COLUMNS can also be used to drop columns. For example:

"ALTER TABLE test_change REPLACE COLUMNS (a int, b int);" will remove column `c' from test_change's schema. Note that this does not delete underlying data, it just changes the schema.

(4)REGEX Column Specification SELECT 語句可以使用正則表示式做列選擇,下面的語句查詢除了 ds 和 hr 之外的所有列:

SELECT `(ds|hr)?+.+` FROM test

4、檢視變數

hive> set; … hive> set-v; … even more output!… ‘set’輸出 hivevar,hiveconf,system 和 env 名稱空間下的所有變數。 ‘set -v’包括了輸出Hadoop定義的全部變數。 hive> set hivevar:foo=hello; hive> set hivevar:foo; hivevar:foo=hello 使用變數: hive> create table toss1(i int, ${hivevar:foo} string);

5、一個完整的建庫、表例子

-- 建立資料庫
create database ecdata WITH DBPROPERTIES ('creator' = 'June', 'date' = '2014-06-01');
-- 或者使用 COMMENT 關鍵字
-- 檢視資料庫描述
DESCRIBE DATABASE ecdata;
DESCRIBE DATABASE EXTENDED  ecdata;
-- 切庫
use ecdata;
 
-- 刪除表
drop table ext_trackflow;

-- 建立表
create EXTERNAL table IF NOT EXISTS ext_trackflow (
    cookieId     string        COMMENT '05dvOVC6Il6INhYABV6LAg==',
    cate1        string        COMMENT '4',
    area1        string        COMMENT '102',
    url          string        COMMENT 'http://cd.ooxx.com/jinshan-mingzhan-1020',
    trackTime    string        COMMENT '2014-05-25 23:03:36',
    trackURLMap  map<string,String>        COMMENT '{"area":"102","cate":"4,29,14052"}',
)
PARTITIONED BY (statDate STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '