1. 程式人生 > >Hive學習筆記(四)與表有關的HiveQL語句

Hive學習筆記(四)與表有關的HiveQL語句

use mydb;
show tables;

或者

show tables in mydb;

如果有很多的表,可以使用正則表示式來過濾出所需要的表名:

show tables LIKE 'empl.*';

特別要注意的是,IN database_name語句和對錶名使用正則表示式兩個功能尚不支援同時使用。
3.查看錶的詳細資訊:

DESCRIBE EXTENDED employees;

使用FORMATTED關鍵字代替EXTENDED關鍵字的話,可以提供更加可讀的和冗長的輸出資訊。實際情況是使用FORMATTED關鍵字更多。
如果使用者只想檢視某一列的資訊,那麼只要在表名後增加這個欄位的名稱:

DESCRIBE employees.salary;

4.外部表和內部表(內部表也叫管理表)
我們目前建立的表都是所謂的管理表,但是管理表不方便和其他工作共享資料。例如,假設我們有一份由其他工具建立並主要由這一工具使用的資料,同時我們還想使用Hive在這份資料上執行查詢,可是並沒有給予Hive對資料的所有權,這時我們就可以建立外部表指向這份資料,而並不需要對其具有所有權。
建立外部表,其可以讀取所有位於/data/stocks目錄下的以逗號分隔的資料:

CREATE EXTERNAL TABLE IF NOT EXISTS stocks (
    exchange STRING,
    symbol STRING,
    ymd STRING,
    price_open FLOAT
, price_high FLOAT, price_low FLOAT, price_close FLOAT, volume INT, price_adj_close FLOAT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/data/stocks';

EXTERNAL關鍵字表明此表是一個外部表,LOCATION表明此表的儲存路徑。
有一些HiveQL語法結構並不適合外部表。
使用者可以拷貝一張已經存在的表的表模式(不會複製資料):

CREATE EXTERNAL TABLE IF
NOT EXISTS mydb.wos_cm1 LIKE mydb.wos_cm LOCATION '/path/to/data';

注意:

  • 如果語句中省略掉EXTERNAL關鍵字而且源表是外部表的話,那麼生成的新表也是外部表。
  • 如果語句中省略掉EXTERNAL關鍵字而且源表是管理表的話,那麼生成的新表也是管理表。
  • 如果語句中包含EXTERNAL關鍵字而且源表是管理表的話,那麼生成的新表也是外部表。
  • 即使在這種場景下,LOCATION也同樣是可選的。
    5.分割槽表
    分割槽表的優勢:
    對於非常大的資料,分割槽表可以顯著地提高查詢效能,而且分割槽表能使資料以一種符合邏輯的方式進行組織,比如分層儲存。
    首先討論下分割槽管理表。
    下面一個例子是先按照country再按照state對資料分割槽:
CREATE TABLE employees (
    name STRING,
    salary FLOAT,
    subordinates ARRAY<STRING>,
    deductions MAP<STRING,FLOAT> COMMENT,
    address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
)
PARTITIONED BY (country STRING, state STRING);

注意:
如果表中的資料以及分割槽的個數都非常大的話,執行這樣一個包含有所有分割槽的查詢可能會觸發一個巨大的MapReduce任務。一個高度建議的安全措施是將Hive設定成“strict”模式,這樣如果對分割槽表查詢而WHERE子句沒有加分割槽過濾的話,將會禁止提交這個任務。

SET hive.mapred.mode=strict;

使用者也可以按照上面的語句將屬性值設定為“mostrict”模式。
查看錶中存在的所有分割槽:

SHOW PARTITIONS employees;

如果表中存在很多的分割槽,而使用者只想檢視一個特定的分割槽,則可以這樣:

SHOW PARTITIONS employees PARTITION(country='US');

DESCRIBE EXTENDED employees命令也會顯示分割槽鍵。
在管理表中使用者可以通過載入資料的方式建立分割槽,如下例中的語句從一個本地目錄($HOME/california-employees)載入資料到表中的時候,將會建立一個US和CA的分割槽。
請注意我們在HiveQL中是如何引用HOME環境變數的:

LOAD DATA LOCAL INPATH '${env:HOME}/california-employees'
INTO TABLE employees
PARTITION (country='US', state='CA');

再討論下外部分割槽表。
建立外部分割槽表:

CREATE EXTERNAL TABLE IF NOT EXISTS log_messages (
    hms    INT,
    severity    STRING,
    server      STRING,
    PROCESS_ID INT,
    message STRING)
PARTITIONED BY (year INT, month INT, day INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

ALTER TABLE語句可以單獨進行增加分割槽,這個語句需要為每一個分割槽鍵指定一個值:

ALTER TABLE log_messages ADD PARTITION(year =2012, month = 1, day = 2)
LOCATION 'hdfs://ec1.hfut:8020/user/hive/warehouse/liuyajue.db/log_messages/2012/01/02';

6.使用者可以指定第三方的輸入和輸出格式以及SerDe,這個功能允許使用者自定義Hive本身不支援的其他廣泛的檔案格式。
如果需要對某些欄位進行聚類儲存,方便對hive叢集列進行取樣,則應該這樣編寫:

create table test_ds
(
  id int comment '使用者ID',
  name string comment '使用者名稱稱'
)
comment '測試分割槽表'
partitioned by(ds string comment '時間分割槽欄位')
clustered by(id) sorted by(name) into 32 buckets    
row format delimited 
fields terminated by '\t'
stored as rcfile;

這裡表示將id按照name進行排序,聚類彙總,然後分區劃分到32個雜湊桶中。
7.檢視hive表在hdfs上的儲存路徑:

show create table mydb.log_messages;

8.刪除表:

DROP TABLE IF EXISTS employees;

9.表重新命名:用RENAME TO

ALTER TABLE qirui_user RENAME TO qirui;

10.使用者可以高效地移動位置來修改某個分割槽的路徑:

ALTER TABLE log_messages PARTITION(year=2012, month=1, day=2)
SET LOCATION 's3n://ourbucket/logs/2012/01/02';

這個命令不會將資料從舊的路徑轉移走,也不會刪除舊的資料。
11.使用者刪除某個分割槽:

ALTER TABLE log_messages DROP IF EXISTS PARTITION(year=2012, month=1, day=2);

12.修改列資訊:

  • 設定列名為hms是第一列
ALTER TABLE log_messages
CHANGE COLUMN hours_minutes_seconds hms INT
COMMENT 'the hours'
FIRST;
  • 設定列名為process_id的列在列名為hms的後面
ALTER TABLE log_messages
CHANGE COLUMN process_id process_id1 INT
COMMENT 'process_id'
AFTER hms;

13.刪除或替換列:

ALTER TABLE log_messages REPLACE COLUMNS (
    hours_mins_secs INT COMMENT 'hour, minute, seconds from timestamp',
    severity STRING COMMENT 'The message severity',
    message STRING COMMENT 'The rest of the message');

14.修改表屬性:

ALTER TABLE employees SET TBLPROPERTIES(
    'notes' = 'The process id is no longer captured; this column is always NULL');

15.修改儲存屬性:

ALTER TABLE log_messages
PARTITION (year=2017, month=1,dat=1)
SET FILEFORMAT SEQUENCEFILE;

16.防止分割槽被刪除:

ALTER TABLE log_messages
PARTITION(year=2012, month=1, day=2) ENABLE NO_DROP;

防止分割槽被查詢:

ALTER TABLE log_messages
PARTITION(year=2012, month=1, day=2) ENABLE OFFLINE;

用DISABLE替換ENABLE可以起到反作用。

本文為原創部落格,僅供技術學習使用。未經允許,禁止將其複製下來上傳到百度文庫等平臺。如有轉載請註明本文部落格的地址(連結)。