Hive 官方手冊翻譯 -- Hive DDL(數據定義語言)

Hive DDL(數據定義語言)

Confluence Administrator創建, Janaki Lahorani修改於 2018年9月19日

原文鏈接

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

翻譯:Google Google翻譯,金山軟件 金山詞霸

校對:南大通用 範振勇 (2018.9.26)

一、概述

這裏是HiveQL DDL語句的文檔,其中包括:

    CREATE 數據庫/SCHEMA,表,視圖,函數,索引

    DROP 數據庫/SCHEMA,表,視圖,索引

    TRUNCATE表

    ALTER 數據庫/SCHEMA,表,視圖

    MSCK REPAIR TABLE(或ALTER TABLE RECOVER PARTITIONS)

    SHOW 數據庫/SCHEMA,表,表屬性,視圖,分區,函數,索引 [ES],列,創建表語句

    DESCRIBE 數據庫/SCHEMA,表 視圖

    PARTITION語句通常是TABLE語句的選項,除了SHOW分區。

二、關鍵詞,非保留關鍵字和保留關鍵字

表格 1 關鍵詞,非保留關鍵字和保留關鍵字

 

所有關鍵詞

Hive版本

非保留關鍵字

保留關鍵字

1.2.0

ADD, ADMIN, AFTER, ANALYZE, ARCHIVE, ASC, BEFORE, BUCKET, BUCKETS, CASCADE, CHANGE, CLUSTER, CLUSTERED, CLUSTERSTATUS, COLLECTION, COLUMNS, COMMENT, COMPACT, COMPACTIONS, COMPUTE, CONCATENATE, CONTINUE, DATA, DATABASES, DATETIME, DAY, DBPROPERTIES, DEFERRED, DEFINED, DELIMITED, DEPENDENCY, DESC, DIRECTORIES, DIRECTORY, DISABLE, DISTRIBUTE, ELEM_TYPE, ENABLE, ESCAPED, EXCLUSIVE, EXPLAIN, EXPORT, FIELDS, FILE, FILEFORMAT, FIRST, FORMAT, FORMATTED, FUNCTIONS, HOLD_DDLTIME, HOUR, IDXPROPERTIES, IGNORE, INDEX, INDEXES, INPATH, INPUTDRIVER, INPUTFORMAT, ITEMS, JAR, KEYS, KEY_TYPE, LIMIT, LINES, LOAD, LOCATION, LOCK, LOCKS, LOGICAL, LONG, MAPJOIN, MATERIALIZED, METADATA, MINUS, MINUTE, MONTH, MSCK, NOSCAN, NO_DROP, OFFLINE, OPTION, OUTPUTDRIVER, OUTPUTFORMAT, OVERWRITE, OWNER, PARTITIONED, PARTITIONS, PLUS, PRETTY, PRINCIPALS, PROTECTION, PURGE, READ, READONLY, REBUILD, RECORDREADER, RECORDWRITER, REGEXP, RELOAD, RENAME, REPAIR, REPLACE, REPLICATION, RESTRICT, REWRITE, RLIKE, ROLE, ROLES, SCHEMA, SCHEMAS, SECOND, SEMI, SERDE, SERDEPROPERTIES, SERVER, SETS, SHARED, SHOW, SHOW_DATABASE, SKEWED, SORT, SORTED, SSL, STATISTICS, STORED, STREAMTABLE, STRING, STRUCT, TABLES, TBLPROPERTIES, TEMPORARY, TERMINATED, TINYINT, TOUCH, TRANSACTIONS, UNARCHIVE, UNDO, UNIONTYPE, UNLOCK, UNSET, UNSIGNED, URI, USE, UTC, UTCTIMESTAMP, VALUE_TYPE, VIEW, WHILE, YEAR

ALL, ALTER, AND, ARRAY, AS, AUTHORIZATION, BETWEEN, BIGINT, BINARY, BOOLEAN, BOTH, BY, CASE, CAST, CHAR, COLUMN, CONF, CREATE, CROSS, CUBE, CURRENT, CURRENT_DATE, CURRENT_TIMESTAMP, CURSOR, DATABASE, DATE, DECIMAL, DELETE, DESCRIBE, DISTINCT, DOUBLE, DROP, ELSE, END, EXCHANGE, EXISTS, EXTENDED, EXTERNAL, FALSE, FETCH, FLOAT, FOLLOWING, FOR, FROM, FULL, FUNCTION, GRANT, GROUP, GROUPING, HAVING, IF, IMPORT, IN, INNER, INSERT, INT, INTERSECT, INTERVAL, INTO, IS, JOIN, LATERAL, LEFT, LESS, LIKE, LOCAL, MACRO, MAP, MORE, NONE, NOT, NULL, OF, ON, OR, ORDER, OUT, OUTER, OVER, PARTIALSCAN, PARTITION, PERCENT, PRECEDING, PRESERVE, PROCEDURE, RANGE, READS, REDUCE, REVOKE, RIGHT, ROLLUP, ROW, ROWS, SELECT, SET, SMALLINT, TABLE, TABLESAMPLE, THEN, TIMESTAMP, TO, TRANSFORM, TRIGGER, TRUE, TRUNCATE, UNBOUNDED, UNION, UNIQUEJOIN, UPDATE, USER, USING, UTC_TMESTAMP, VALUES, VARCHAR, WHEN, WHERE, WINDOW, WITH

 

2.0.0

刪除: REGEXP, RLIKE

補充: AUTOCOMMIT, ISOLATION, LEVEL, OFFSET, SNAPSHOT, 事務,工作,寫

添加: COMMIT, ONLY, REGEXP, RLIKE, ROLLBACK, START

 

2.1.0

添加: ABORT, KEY, LAST, NORELY, NOVALIDATE, NULLS, RELY, VALIDATE

添加: CACHE, CONSTRAINT, FOREIGN, PRIMARY, REFERENCES

2.2.0

添加: DETAIL, DOW, EXPRESSION, OPERATOR, QUARTER, SUMMARY, VECTORIZATION, WEEK, YEARS, MONTHS, WEEKS, DAYS, HOURS, MINUTES, SECONDS

添加: DAYOFWEEK, EXTRACT, FLOOR, INTEGER, PRECISION, VIEWS

 

3.0.0

添加: TIMESTAMPTZ, ZONE

添加: TIME, NUMERIC, SYNC

版本信息

REGEXP和RLIKE在Hive2.0.0之前是非保留關鍵字,從Hive2.0.0開始是保留關鍵字。

按照“支持帶引號的列名”,可以將保留關鍵字使用引號包圍以便允許將其作爲標識符。爲了減少在語法歧義,大部分的關鍵字是保留關鍵字(1.2.0版本及更高版本)。

如果用戶仍想使用這些保留的關鍵字作爲標識符,有如下兩種方式:

1)、使用帶引號的標識符;

2)、設置hive.support.sql11.reserved.keywords =false。(版本2.1.0及更早版本)

三、創建/刪除/修改/使用數據庫

3.1、 創建數據庫

CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
  [COMMENT database_comment]
  [LOCATION hdfs_path]
  [WITH DBPROPERTIES (property_name=property_value, ...)];

SCHEMA和DATABASE的用途是可以互換的,他們的含義相同。

CREATE DATABASE在Hive0.6加入的(HIVE-675)。

WITH DBPROPERTIES子句是在Hive0.7加入的(HIVE-1836)。

3.2、 刪除數據庫

DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];

 

SCHEMA和DATABASE的用途是可以互換的,他們的含義相同。

在Hive0.6加入DROP DATABASE (HIVE-675)。

默認行爲是RESTRICT,其中如果數據庫不是空的DROP DATABASE將失敗。要刪除包含表的數據庫,需要使用DROP DATABASE ... CASCADE。在Hive0.8開始支持RESTRICT和CASCADE。

3.3、 修改數據庫

ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, ...);
ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role;
ALTER (DATABASE|SCHEMA) database_name SET LOCATION hdfs_path;

SCHEMA和DATABASE的用途是可以互換的,他們的含義相同。ALTER SCHEMA在Hive0.14加入(HIVE-6601)。

在ALTER DATABASE ... SET LOCATION語句並不將數據庫的當前目錄中的內容移到新指定的位置。它不改變指定的數據庫下的所有表/分區相關聯的位置。它只是修改了即將添加到這個數據庫中的新表的默認父目錄。此行爲是類似於修改表目錄而不移動現有的分區到另外的位置。

數據庫中其他元數據是不可以修改的。

3.4、 使用數據庫

USE database_name;
USE DEFAULT;

 USE設置接下來所有HiveQL語句的當前數據庫。要還原到默認的數據庫,使用關鍵字“ default”,而不是數據庫名稱。

取得當前正在使用的數據庫:SELECT current_database()(從Hive0.13.0)。

USE database_name在Hive0.6中加入(HIVE-675)。

四、創建/刪除/截斷表

4.1、 創建表

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
  [(col_name data_type [COMMENT col_comment], ... [constraint_specification])]
  [COMMENT table_comment]
  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
  [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
  [SKEWED BY (col_name, col_name, ...)]
     ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
     [STORED AS DIRECTORIES]
  [
   [ROW FORMAT row_format]
   [STORED AS file_format]
     | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (property_name=property_value, ...)]
  [AS select_statement];

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
  LIKE existing_table_or_view_name
  [LOCATION hdfs_path];

 data_type
  : primitive_type
  | array_type
  | map_type
  | struct_type
  | union_type

primitive_type
  : TINYINT
  | SMALLINT
  | INT
  | BIGINT
  | BOOLEAN
  | FLOAT
  | DOUBLE
  | DOUBLE PRECISION
  | STRING
  | BINARY
  | TIMESTAMP
  | DECIMAL
  | DECIMAL(precision, scale)
  | DATE
  | VARCHAR
  | CHAR

array_type
  : ARRAY < data_type >

map_type
  : MAP < primitive_type, data_type >
 
struct_type
  : STRUCT < col_name : data_type [COMMENT col_comment], ...>

union_type
   : UNIONTYPE < data_type, data_type, ... >

row_format
  : DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
        [MAP KYS TERMINATED BY char] [LINES TERMINATED BY char]
        [NULL DEFINED AS char]
  | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]

file_format:
  : SEQUENCEFILE
  | TEXTFILE    -- (Default, depending on hive.default.fileformat configuration)
  | RCFILE
  | ORC
  | PARQUET
  | AVRO
  | JSONFILE    -- (Note: Available in Hive 4.0.0 and later)
  | INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname

 constraint_specification:
  : [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE ]
    [, CONSTRAINT constraint_name FOREIGN KEY (col_name, ...) REFERENCES table_name(col_name, ...) DISABLE NOVALIDATE

 CREATE TABLE根據給定名稱創建表。如果已經存在一個具有相同名稱的表或視圖,則會引發錯誤。您可以使用IF NOT EXISTS跳過錯誤。

  • 表名和列名不區分大小寫,但SERDE和屬性名稱是區分大小寫的。
    •  在Hive0.12和更早的版本中,表名和列名只允許由字母數字和下劃線組成。
    •  在Hive0.13之後,列名可以包含任何的Unicode字符(見HIVE-6013),然而,點和冒號( :)上查詢時會產生錯誤,所以它們在Hive1.2.0是不允許的(見HIVE-10120)。用反引號內指定的任何列名都按字面處理。在反引號字符串中,用雙反引號(``)來表示一個反引號字符。反引號也使得表和列標識符可使用保留關鍵字。
    •  要恢復到0.13.0之前的模式,即列名爲字符和下劃線字符,需要設置配置屬性hive.support.quoted.identifiers爲none。在這種配置中,反引號名成被解釋爲正則表達式。有關詳細信息,請參閱在列名中支持帶引號的標識符
  • 表和列註釋字符串(單引號)。
  • 創建時沒有External 子句的表被稱爲託管表,因爲Hive管理其數據。要判斷一個表託管表還是外部表,執行 DESCRIBE EXTENDED表名即可輸出表的類型。
  • TBLPROPERTIES子句允許你用鍵/值對定義自己的元數據。一些預定義的表屬性也是如此,如last_modified_user和last_modified_time就由Hive自動添加和管理。其他預定義的表屬性包括:
    • TBLPROPERTIES ("comment"="table_comment")
    • TBLPROPERTIES ("hbase.table.name"="table_name") – 見集成HBASE.
    • TBLPROPERTIES ("immutable"="true") 或("immutable"="false")– 見通過查詢查插入數據到Hive表.
    • TBLPROPERTIES ("orc.compress"="ZLIB") 或("orc.compress"="SNAPPY") 或 ("orc.compress"="NONE") 和其他ORC屬性– 見ORC文件.
    • TBLPROPERTIES ("transactional"="true")或 ("transactional"="false")– 見Hive事務.
    • TBLPROPERTIES ("NO_AUTO_COMPACTION"="true") 或 ("NO_AUTO_COMPACTION"="false"), 缺省是 "false" – 見Hive事務.
    • TBLPROPERTIES ("compactor.mapreduce.map.memory.mb"="mapper_memory") – 見Hive事務.
    • TBLPROPERTIES ("compactorthreshold.hive.compactor.delta.num.threshold"="threshold_num") –見Hive事務.
    • TBLPROPERTIES ("compactorthreshold.hive.compactor.delta.pct.threshold"="threshold_pct") – 見Hive事務.
    • TBLPROPERTIES ("auto.purge"="true") 或 ("auto.purge"="false") – 見刪除表、刪除分區、截斷表和覆蓋式插入數據.
    • TBLPROPERTIES ("EXTERNAL"="TRUE")–修改託管表爲外部表,反之亦然爲“FALSE”.
      • 在Hive2.4.0中(HIVE-16324)屬性“EXTERNAL”的值被解析爲布爾型(不區分大小寫的true或false),而不是比較時區分大小寫字符串。
  •  要指定表的數據庫,或者在CREATE TABLE語句之前調用USE數據庫名稱,或者在CREATE TABLE語句之內指明數據庫名稱(如database_name.table.name)。

    關鍵字“ default”可用於默認的數據庫。

 請參閱下面的ALTER TABLE有關表註釋,表屬性,SERDE屬性的詳細信息。

 請參見Hive類型系統和Hive數據類型中有關原生數據類型和複雜數據類型的詳細信息。

4.1.1、  託管表和外部表

缺省情況下,Hive創建託管表,其中的文件,元數據和統計信息由Hive進程內部管理。一個託管表存儲在hive.metastore.warehouse.dir.path屬性指定的目錄下,默認情況下,文件夾路徑類似/user/hive/warehouse/databasename.db/tablename/。默認位置可以在創建表的過程中通過重寫location屬性修改。如果一個託管表或分區被刪除,與該表或分區相關聯的數據和元數據都被刪除。如果未指定PURGE選項,則數據被移動到垃圾文件夾,再保留事先定義的一段時間。

當Hive負責託管表的生命週期或生成臨時表時,就使用託管表。

外部表描述了外部文件的元數據/Schema。外部表文件可以由Hive之外的進程訪問和處理。外部表可以訪問存儲在外的數據源,例如Azure存儲卷(ASV)或遠程HDFS位置的數據。當外部表的結構或分區被改變時,可用MSCK REPAIR TABLE TABLE_NAME語句刷新元數據信息。

當外部表的文件已經存在或位於遠程位置時,即使刪除了該表,文件也會保留。

託管表或外部表可以使用DESCRIBE FORMATTED TABLE_NAME命令識別,該命令將根據表類型顯示MANAGED_TABLE或EXTERNAL_TABLE。

統計數據可以用於內部表、外部表和分區的查詢優化。 

4.1.2、  存儲格式

Hive支持內置和定製開發的文件格式。見CompressedStorage 關於壓縮表存儲的詳細說明。

下面是一些內置Hive格式:

 存儲格式

描述

STORED AS TEXTFILE

保存爲純文本文件。TEXTFILE是默認的文件格式中,除非配置參數hive.default.fileformat有其他的設置。

使用DELIMITED子句來分隔文件;允許使用轉義爲分隔符的'ESCAPED BY子句(如ESCAPED BY“\”),如果你的數據中包含分隔符,就需要用轉義符進行轉義。

可自定義NULL格式,由 “NULL DEFINED AS”子句指定(默認爲“\N”)。

STORED AS SEQUENCEFILE

存儲爲壓縮的序列文件

STORED AS ORC

存儲爲ORC文件格式。支持ACID事務和基於成本的優化器(CBO)。採用列存格式存儲數據。

STORED AS PARQUET

在Hive0.13.0和更高版本中,STORED AS PARQUET 保存爲PARQUET列存格式。

在Hive0.10,0.11,0.12中使用ROW FORMAT SERDE ...STORE AS INPUTFORMAT ... OUTPUTFORMAT語法... 。

STORED AS AVRO

存儲爲Avro的格式

STORED AS RCFILE

存儲RCFILE格式

STORED AS JSONFILE

存儲爲JSON文件格式(Hive4.0.0以後)

STORED BY

由非本地表的格式存儲。要創建或鏈接到一個非本地表,例如通過支持一個表的HBase或Druid或Accumulo 。

見StorageHandlers 中有關此選項的更多信息。

INPUTFORMAT and OUTPUTFORMAT

在file_format子句中,用一個字符串指定相應的InputFormat和OutputFormat類名。例如,

'org.apache.hadoop.hive.contrib.fileformat.base64.

Base64TextInputFormat'。

對於LZO壓縮,要使用的值是

'INPUTFORMAT “com.hadoop.mapred.

DeprecatedLzoTextInputFormat”

OUTPUTFORMAT “ org.apache.hadoop.hive.ql.io .

HiveIgnoreKeyTextOutputFormat”'

(見LZO壓縮)。

4.1.3、  行格式與SERDE

您可以在創建表時使用自定義SERDE或內置的SERDE。如果未指定ROW FORMAT或用ROW FORMAT DELIMITED指定,則採用內置SERDE。

使用SERDE子句創建自定義SERDE的表。有關SerDes的更多信息,請參見:

    Hive SerDe

    SerDe

    HCatalog存儲格式

必須爲使用本機Serde的表指定列表,有關允許的列類型,請參閱“用戶指南”中的“類型”部分。

可以爲使用自定義SerDe的表指定列表,但Hive將查詢Serde以確定該表的實際列表。

有關SerDes的一般信息,請參閱開發人員指南中的HiveSerDe。有關輸入和輸出處理的詳細信息,請參見Serde。

要修改表的SERDE或SERDEPROPERTIES,參考下面ALTER TABLE語句中添加SERDE屬性的描述。

行格式

描述

正則表達式

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'

WITH SERDEPROPERTIES

“input.regex”= “<正則表達式>”

STORED AS TEXTFILE;

保存爲純文本文件,通過正則表達式轉換。

下面的示例定義了Apache缺省博客格式的表。

CREATE TABLE apachelog (

  host STRING,  identity STRING,  user STRING, 、 time STRING,  request STRING,  status STRING,

  size STRING,  referer STRING,  agent STRING)

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'

WITH SERDEPROPERTIES (

  "input.regex" = "([^]*) ([^]*) ([^]*) (-|\\[^\\]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\".*\") ([^ \"]*|\".*\"))?"

)

STORED AS TEXTFILE;

更多RegexSerDe的信息參見HIVE-662和HIVE-1719。

JSON

ROW FORMAT SERDE

'org.apache.hive.hcatalog.data.JsonSerDe'

STORED AS TEXTFILE

存儲爲JSON格式的純文本文件。

提供JSON支持的JsonSerDe在Hive0.12及更高版本中支持。

在一些發佈版中,需要添加Hivehcatalog-core.jar的引用。

ADD JAR /usr/lib/hive-hcatalog/lib/hive-hcatalog-core.jar;

CREATE TABLE my_table(a string, b bigint, ...)

ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'

STORED AS TEXTFILE;

該JsonSerDe是被從HCatalog移動到Hive的,在它成爲Hive contrib項目之前。它由HIVE-4895添加Hive發佈版。在0.12.0版本之前,可以使用亞馬遜發佈的SERDE, s3://elasticmapreduce/samples/hive-ads/libs/jsonserde.jar。

從Hive3.0.0開始,JsonSerDe被添加到Hive SERDE中“org.apache.hadoop.hive.serde2.JsonSerDe”(HIVE-19211)。

CREATE TABLE my_table(a string, b bigint, ...)

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.JsonSerDe'

STORED AS TEXTFILE;

或者從Hive4.0.0開始支持STORED AS JSONFILE(HIVE-19899),這樣你就可以如下創建表:

CREATE TABLE my_table(a string, b bigint, ...) STORED AS JSONFILE;

CSV/TSV

 

ROW FORMAT SERDE

'org.apache.hadoop.hive.serde2.OpenCSVSerde'

STORED AS TEXTFILE

存儲爲CSV / TSV格式的純文本文件。

該CSVSerde是在Hive0.14和以後版本是可用的。

下面的示例創建一個TSV(製表符分隔)文件。

CREATE TABLE my_table(a string, b string, ...)

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'

WITH SERDEPROPERTIES (

   "separatorChar" = "\t",

   "quoteChar"     = "'",

   "escapeChar"    = "\\"

)

STORED AS TEXTFILE;

對於SERDE默認屬性是逗號分隔(CSV)文件

DEFAULT_ESCAPE_CHARACTER \

DEFAULT_QUOTE_CHARACTER  "

DEFAULT_SEPARATOR        ,

這SERDE適用於大多數CSV數據,但不處理嵌入換行符。要使用SERDE,指定完整類名org.apache.hadoop.hive.serde2.OpenCSVSerde。

文檔是基於原始規範文件  https://github.com/ogrodnek/csv-serde。

限制:

此Serde將所有列視爲String類型。即使使用該SerDe創建具有非字符串列類型的表,DESCRIBE TABLE的輸出也會顯示字符串列類型。類型信息將從Serde檢索。

要將列轉換爲表中所需的類型,可以在表上創建一個視圖來執行CAST轉換爲所需的類型。

CSV SerDe基於https:/github.com/ogrodnek/csv-serde,並添加到包含hive-7777中的Hive發佈中。CSVSerde已經在Hive 0.14及更高版本上構建和測試,並且使用了OpenCSV2.3,它與Hive捆綁在一起發佈。

有關SerDes的一般信息,請參閱開發指南中的Hive SerDe。有關輸入和輸出處理的詳細信息,請參見Serde。

4.1.4、  分區表

分區表可以使用PARTITIONED BY子句來創建。一個表可以有一個或多個分區列,分區列的每個不同值組合被創建一個單獨的數據目錄。此外,可以使用CLUSTERED BY列對錶或分區進行存儲,並且可以通過SORT BY列在該存儲桶中對數據進行排序。這可以提高某些類型查詢的性能。

如果在創建分區表時,您得到了這樣的錯誤:“Failure:Error in SemanticAnalysis:列在分區列中重複出現”,這意味着您試圖將已分區的列包含在表本身的數據中。您可能確實已經定義了列。但是,您創建的分區時產生了一個僞列,您可以對其進行查詢,因此您必須將表的已有列重命名爲其他內容(用戶不應該對其進行查詢!)。

 

例如,假設您的原始未分區表有三列:ID,date和name。

例:

id     int,
date   date,
name   varchar

 

現在你想根據date分區。您的Hive定義可以使用“dtDontQuery”作爲列名,這樣“date”可用於分區(和查詢)。

例:

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

現在,您的用戶仍然在查詢“ where date = '...'”但第二列dtDontQuery將保持原來的值。

下面是一個例子語句來創建分區表:

例:

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)
 STORED AS SEQUENCEFILE;

上面的語句創建了具有viewTime、userid、page_url、referrer_url和ip列(包括註釋)的page_view表。還對錶進行分區,並將數據存儲在序列文件中。文件中的數據格式被假定爲由ctrl-A分隔的字段和由換行符分隔的行。

例:

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'
 STORED AS SEQUENCEFILE;

上面的語句爲您創建與前一個表相同的表。

在前面的示例中,數據存儲在<hive.metastore.warehouse.dir>/page_view中。在Hive配置文件hive-site.xml中爲hive.metastore.warehouse.dir指定一個值。

4.1.5、  外部表

EXTERNAL關鍵字允許您創建一個表並提供一個位置,這樣Hive就不會對此表使用默認位置。如果您已經生成了數據,這是很有用的。刪除外部表時,表中的數據不會從文件系統中刪除。

外部表指向用於其存儲的任何HDFS位置,無需存儲在配置屬性hive.asionore.warehouse.dir指定的文件夾中。

例:

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 '<hdfs_location>';

您可以使用上面的語句創建一個page_view表,該表指向用於存儲的任何HDFS位置。但是,您仍然必須確保數據按照上面CREATE語句中指定的分隔符。

有關創建外部表的另一個示例,請參見本教程中的加載數據部分。

4.1.6、  CREATE TABLE AS SELECT(CTAS)

表也可以通過一個CREATE-TABLE-AS-SELECT(CTAS)語句中的查詢結果來創建和填充。CTAS創建的表是原子的,這意味着在填充所有查詢結果之前,其他用戶不會看到該表。因此,其他用戶要麼會看到具有完整查詢結果的表,要麼根本不會看到該表。

CTAS中有兩個部分,SELECT部分可以是HiveQL支持的任意SELECT語句。CTAS的CREATE部分從SELECT部分獲取結果模式,並使用其他的表屬性(如Serde和存儲格式)創建目標表。

CTAS有以下限制:

  1.     目標表不能是分區表。
  2.     目標表不能是外部表。
  3.     目標表不能是列表桶表。

例:

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;

上面的CTAS語句使用從SELECT語句的結果派生的模式(new_key Double,key_value_pair String)來創建目標表new_key_value_store。如果SELECT語句沒有指定列別名,列名將自動分配給_col0、_col1和_col2等。此外,新目標表使用與SELECT語句中源表無關的特定SerDe和存儲格式,。

從Hive 0.13.0開始,SELECT語句可以包含一個或多個公共表達式(CTE),如SELECT語法所示。有關示例,請參見公共表達式。

能夠從一個表選擇數據到另一個表是Hive最強大的特性之一。在執行查詢時,Hive處理從源格式到目標格式的數據轉換。

4.1.7、  CREATE TABLE LIKE

CREATE TABLE的LIKE形式允許您準確地複製現有的表定義(而不復制其數據)。與CTAS不同,下面的語句創建了一個新的empty_key_value_store表,其定義在表名以外的所有細節中都與現有的key_value_store完全匹配。新表不包含任何行。

CREATE TABLE empty_key_value_store
LIKE key_value_store [TBLPROPERTIES (property_name=property_value, ...)];

Hive0.8.0之前,CREATE TABLE LIKE VIEW_NAME將使視圖的副本。在Hive0.8.0和以後的版本中,使用用於SERDE和文件格式的默認CREATE TABLE LIKE VIEW_NAME通過採用VIEW_NAME(字段和分區列)的模式創建一個表。

在Hive0.8.0之前,CREATE TABLE LIKE view_name將生成視圖的副本。在Hive0.8.0和更高版本中,CREATE TABLE VIEW_NAME通過使用缺省設置的Serde和文件格式,根據view_name的Sechma(字段和分區列)來創建一個表。

4.1.8、  排序分桶表

例:

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)
 CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
 ROW FORMAT DELIMITED
   FIELDS TERMINATED BY '\001'
   COLLECTION ITEMS TERMINATED BY '\002'
   MAP KEYS TERMINATED BY '\003'
 STORED AS SEQUENCEFILE;

在上面的示例中,page_view表是按用戶ID進行分桶的,並且在每個桶中,數據按照viewTime升序排序。這樣的組織允許用戶對集羣列執行有效的抽樣-在本例中是userid。排序屬性允許內部操作符在評估查詢時利用已知的數據結構,也可以提高效率。MAP KEYS和COLLECTION ITEMS 關鍵字可以使用任何列的列表或映射。

CLUSTERED BY 和SORTED BY不會影響數據插入表的方式-隻影響數據的讀取方式。這意味着用戶必須小心地正確插入數據,方法是指定reducers的數量與存儲桶的數量相等,並在查詢中使用CLUSTER BY 和 SORT BY命令。

還有一個創建和填充桶表的例子。

4.1.9、  傾斜表

設計文檔

有關更多信息,請閱讀傾斜連接優化和桶列表存儲設計文檔。

此特性可用於在一個或多個列具有傾斜值的表中提高性能。通過指定經常出現的值(嚴重傾斜),Hive將自動將這些文件拆分爲單獨的文件(或桶列表存儲的情況下的目錄),並在查詢過程中考慮到這一事實,以便在可能的情況下跳過或包含整個文件(或桶列表存儲的情況下的目錄)。

在創建表時,可以在每個表級別上指定這一點。

下面的示例顯示了一個列,它有三個傾斜的值,可以選擇使用STORED AS DIRECTORIES子句,該子句指定了對列表進行存儲。

例:

CREATE TABLE list_bucket_single (key STRING, value STRING)
  SKEWED BY (key) ON (1,5,6) [STORED AS DIRECTORIES];

這裏是一個表有兩個傾斜列的例子。

例:

CREATE TABLE list_bucket_multiple (col1 STRING, col2 int, col3 STRING)
  SKEWED BY (col1, col2) ON (('s1',1), ('s3',3), ('s13',13), ('s78',78)) [STORED AS DIRECTORIES];

對於相應的ALTER TABLE語句,請參閱下面ALTER TABLE傾斜或存儲目錄的信息。

4.1.10、     臨時表

臨時表只對當前會話可見。數據將被存儲在用戶的臨時目錄,並在會話結束時刪除。

如果臨時表是用已經存在於數據庫中永久表的數據庫/表名稱創建的,那麼該會話內該表的任何引用將解析到臨時表,而不是永久表。如果不刪除臨時表或將其重命名爲不衝突的名稱,用戶將無法訪問該會話中的原始表。

臨時表有以下限制:

    不支持分區列。

    不支持創建索引。

從Hive1.1.0開始,通過hive.exec.temporary.table.storage配置參數,臨時表的存儲策略可以設置爲memory,ssd或default(見 HDFS的存儲類型和存儲策略)。

例:

CREATE TEMPORARY TABLE list_bucket_multiple (col1 STRING, col2 int, col3 STRING);

4.1.11、     事務性表

版本信息

由Hive4.0實現(HIVE-18453)。

支持與ACID語義操作的表。請參閱此有關事務表的更多細節。

例:

CREATE TRANSACTIONAL TABLE transactional_table_test(key string, value string) PARTITIONED BY(ds string) STORED AS ORC;

4.1.12、     約束

版本信息

由Hive2.1.0實現(HIVE-13290)。

Hive包括對未經驗證的主鍵和外鍵約束的支持。一些SQL工具在存在約束時會生成更高效的查詢。由於這些約束沒有被驗證,上游系統需要在加載到Hive之前確保數據完整性。

例:

create table pk(id1 integer, id2 integer,
  primary key(id1, id2) disable novalidate);
 
create table fk(id1 integer, id2 integer,
  constraint c1 foreign key(id1, id2) references pk(id2, id1) disable novalidate);

4.2、 刪除表

DROP TABLE [IF EXISTS] table_name [PURGE];

DROP TABLE刪除此表的元數據和數據。如果配置了回收站(且未指定PURGE),數據實際上會移動到.Trash/Current目錄。元數據則完全丟失了。

刪除外部表時,將不會從文件系統中刪除表中的數據。

當刪除視圖引用的表時,不會發出任何警告(視圖將無效,必須由用戶刪除或重新創建)。

另外,該表信息被從metastore中刪除,數據也將被刪除,就好象由“hadoopdfs -rm”刪除一樣。在許多情況下,這會導致表中的數據被移動到用戶主目錄的的.Trash文件夾; 因此,錯誤地刪除表的用戶可能能夠通過使用相同模式重新創建表、重新創建任何必要的分區,然後使用Hadoop命令手動將數據移回原處來恢復丟失的數據。因爲依賴於底層實現,此恢復數據的解決方案可能會隨着時間的推移或實際部署情況而更改;強烈建議用戶不要心血來潮地刪除表。

版本信息:PURGE

PURGE選項在0.14.0版本加入(HIVE-7100)。

如果指定PURGE,表中的數據不會轉到.Trash /當前目錄,因此在一個誤操作DROP的情況下無法進行數據恢復。PURGE選項也可以用表屬性中指定auto.purge(見上文的TBLPROPERTIES)。

在Hive0.7.0或更高版本,如果DROP不存在的表會返回一個錯誤,除非指定IF EXISTS或設置變量hive.exec.drop.ignorenonexistent爲真。

有關如何刪除分區,請參閱下面的“更改分區”部分。

4.3、 截斷表

TRUNCATE TABLE table_name [PARTITION partition_spec];
partition_spec:
  : (partition_column = partition_col_value, partition_column = partition_col_value, ...)

刪除表或分區(一個或多個分區)的所有行。如果啓用了文件系統的垃圾回收,數據將被回收,否則它們會被直接刪除(從Hive2.2.0的HIVE-14626)。目前,目標表應該是本機的/託管表,否則將引發異常。對於分區表,用戶可以指定partition_spec一次截斷多個分區,或者省略partition_spec截斷表中的所有分區。

從HIVE 2.3.0開始(HIVE-15880),如果表屬性“auto.purge”(見上面的TBLPROPERTIES)設置爲“true”, 則當對錶發出truncate table命令時,該表的數據不移動到回收站,並且如果誤操作發出的truncate table命令也無法恢復數據。這僅適用於託管表(見託管表)。如果託管表的“auto.purge”屬性未設置或設置爲false,則可以關閉此行爲模式。

4.4、 改變表/分區/列

    ALTER TABLE

        重命名錶

        ALTER TABLE屬性

            ALTER TABLE註釋

        添加SERDE屬性

        ALTER TABLE存儲屬性

        ALTER TABLE傾斜或存儲目錄

            ALTER TABLE傾斜

            ALTER TABLE不傾斜

            ALTER TABLE不存儲目錄

            ALTER TABLE設置傾斜位置

        ALTER TABLE約束

        其他ALTER TABLE語句

    改變分區

        添加分區

            動態分區

        重命名分區

        交換分區

        修復分區(MSCK REPAIR TABLE)

        刪除分區

        分區存檔

    改變表或分區

        ALTER 表/分區 文件格式

        ALTER 表/分區 位置

        ALTER 表/分區TOUCH

        改變表/分區保護

        改變表/分區緊縮

        改變表/分區串聯

        ALTER TABLE /分區更新列

    ALTER COLUMN

        列名規則

        修改列的名稱/類型/位置/註釋

        添加/替換列

        部分分區規範

ALTER TABLE語句使您可以修改現有表的結構。您可以添加列/分區,改變SERDE,添加表和SERDE屬性,或重命名錶本身。同樣,修改表分區語句允許您修改表中特定分區的屬性。

4.4.1、  ALTER TABLE

4.4.1.1、    重命名錶

ALTER TABLE table_name RENAME TO new_table_name;

此語句允許您將表的名稱更改爲不同的名稱。

從0.6版開始,對託管表重命名會移動其HDFS位置。從2.2.0版(hive-14909)中重命名機制已經更改,只有當表創建時沒有Location子句並位於其數據庫目錄下,託管表的HDFS位置纔會被移動。而在HIVE0.6版本之前只是重命名了metastore中的表,而沒有移動HDFS位置。

4.4.1.2、    ALTER TABLE屬性

ALTER TABLE table_name SET TBLPROPERTIES table_properties;

table_properties:
  : (property_name = property_value, property_name = property_value, ... )

您可以使用此語句將自己的元數據添加到表。目前last_modified_user,last_modified_time屬性由Hive自動添加。用戶可以添加自己的屬性到這個列表。您可以執行DESCRIBE EXTENDED TABLE來獲取這些信息。

欲瞭解更多信息,請參閱上面創建表的TBLPROPERTIES子句。

4.4.1.3、    ALTER TABLE註釋

要更改表的註釋,你必須改變TBLPROPERTIES的comment屬性:

ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comment);

4.4.1.4、    添加SERDE屬性

ALTER TABLE table_name [PARTITION partition_spec] SET SERDE serde_class_name [WITH SERDEPROPERTIES serde_properties];

ALTER TABLE table_name [PARTITION partition_spec] SET SERDEPROPERTIES serde_properties;

serde_properties:

  : (property_name = property_value, property_name = property_value, ... )

這些語句使您能夠更改表的SERDE或給SERDE對象添加用戶定義的元數據表。

當Hive初始化該表以序列化和反序列化數據時,Serde屬性將傳遞給該表的Serde。因此,用戶可以在這裏存儲自定義Serde所需的任何信息。有關更多信息,請參閱開發人員指南中的SerDe文檔和Hive Serde。有關在CREATE TABLE語句中設置表的SerDe和SERDEPROPERTIES的詳細信息,請參閱上面的行格式、存儲格式和Serde。

請注意property_name和property_value這兩個都必須加引號。

例:

ALTER TABLE table_name SET SERDEPROPERTIES ('field.delim' = ',');

4.4.1.5、    ALTER TABLE存儲屬性

ALTER TABLE table_name CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name, ...)]
  INTO num_buckets BUCKETS;

這些語句更改表的物理存儲性能。

注意:這些命令只會修改Hive的元數據,不會重新組織或重新格式化現有的數據。用戶應確保實際數據佈局符合元數據定義。

4.4.1.6、    ALTER TABLE傾斜或存儲爲目錄

表的SKEWED和STORED AS DIRECTORIES屬性可以由ALTER TABLE語句來改變。見上文中CREATE TABLE語法中相應的傾斜表部分。

  • ALTER TABLE傾斜
ALTER TABLE table_name SKEWED BY (col_name1, col_name2, ...)
  ON ([(col_name1_value, col_name2_value, ...) [, (col_name1_value, col_name2_value), ...]
  [STORED AS DIRECTORIES];

STORED AS DIRECTORIES選項確定是否傾斜表使用列表桶功能,該功能爲傾斜值創建子目錄。

  • ALTER TABLE不傾斜
ALTER TABLE table_name NOT SKEWED;

 “NOT SKEWED”選項使表不傾斜,並關閉列表桶存儲功能(因爲列表桶存儲表總是傾斜的)。這會影響ALTER語句之後創建的分區,但對ALTER語句之前創建的分區沒有影響。

  • ALTER TABLE不存儲爲目錄
ALTER TABLE table_name NOT STORED AS DIRECTORIES;

這將關閉列表桶存儲功能,儘管表仍然是傾斜的。

  • ALTER TABLE設置傾斜表存儲位置
ALTER TABLE table_name SET SKEWED LOCATION (col_name1="location1" [, col_name2="location2", ...] );

這將更改列表桶存儲位置的映射。

4.4.1.7、    ALTER TABLE約束

版本信息

由Hive2.1.0發佈。

表約束可以通過ALTER TABLE語句添加或移除。

ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (column, ...) DISABLE NOVALIDATE;

ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (column, ...) REFERENCES table_name(column, ...) DISABLE NOVALIDATE RELY;

ALTER TABLE table_name DROP CONSTRAINT constraint_name;
  • 其他ALTER TABLE語句

有關ALTER TABLE或Partition,請參見下面的更多修改表的DDL語句。

4.4.2、  改變分區

分區可以通過在ALTER TABLE語句中使用PARTITION子句來添加,重命名,交換(移動),刪除,存檔(或調檔)。如下所述。爲了讓Metastore知道直接添加到HDFS中的分區,您可以使用Metastore Check命令(MSCK)或在AmazonEMR上使用ALTER TABLE的RECOVER PARTITIONS選項。

有關更改分區的更多方法,請參見下面的修改表/分區。

版本1.2+

從Hive1.2(hive-10307)開始,如果屬性hive.typecheck.on.insert設置爲true(默認),分區規範中指定的分區值將被檢查、轉換和標準化,以符合其列類型。這些值可以是數字字符串。

4.4.2.1、    添加分區

ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];

partition_spec:
  : (partition_column = partition_col_value, partition_column = partition_col_value, ...)

您可以使用ALTER TABLE ADD PARTITION給表添加分區。只有分區值是字符串時,才需要其被引號包圍。Location必須是一個存放內部數據目錄。(ADD PARTITION更改表的元數據,但不會加載數據。如果分區的位置不存在數據,查詢將不會返回任何結果。)

如果表中的已經存在partition_spec的分區,則會引發錯誤。您可以使用IF NOT EXISTS跳過錯誤。

0.7版本

雖然在單個ALTER TABLE中有多個partition_spec語法是正確的,如果你在0.7版本這樣做,則分區方案將失敗。也就是說,每個指定分區的查詢總是隻使用第一個分區。

具體來說,下面的示例將在Hive 0.7中默默地、無錯誤地失敗,並且所有查詢都將只轉到DT=‘2008-08-08’分區,而不管您指定哪個分區。

例:

ALTER TABLE page_view ADD
PARTITION (dt='2008-08-08', country='us') location '/path/to/us/part080808'
PARTITION (dt='2008-08-09', country='us') location '/path/to/us/part080809';

在Hive0.8及更高版本,如前面的示例,你可以在一條ALTER TABLE語句添加多個分區。

在Hive0.7,如果要添加多個分區,你應該使用以下表格:

ALTER TABLE table_name ADD PARTITION (partCol = 'value1') location 'loc1';
ALTER TABLE table_name ADD PARTITION (partCol = 'value2') location 'loc2';
...
ALTER TABLE table_name ADD PARTITION (partCol = 'valueN') location 'locN';

4.4.2.2、    動態分區

分區可以使用Hive INSERT語句(或Pig STORE語句)動態添加。有關詳細信息和示例,請參閱這些文檔:

動態分區設計文檔

教程:動態分區插入

Hive DML:動態分區插入

HCatalog動態分區

        與Pig配合的用法

        MapReduce的用法

4.4.2.3、    重命名分區

ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;

此語句允許您更改分區列的值。其中一個用例是,您可以使用此語句使遺留分區列值規範化,以符合其類型。在這種情況下,即使在屬性hive.typecheck.on.insert設置爲true(默認)下,舊partition_spec中的列值也不啓用類型轉換和規範化,這允許您在舊partition_spec中以字符串形式指定任何遺留數據。

4.4.2.4、    交換分區

分區可以表之間交換(移動)。

版本信息

從Hive0.12(HIVE-4095)。在Hive版本1.2.2、1.3.0和2.0.0中支持多個分區。

-- Move partition from table_name_1 to table_name_2
ALTER TABLE table_name_2 EXCHANGE PARTITION (partition_spec) WITH TABLE table_name_1;

-- multiple partitions
ALTER TABLE table_name_2 EXCHANGE PARTITION (partition_spec, partition_spec2, ...) WITH TABLE table_name_1;

此語句允許您將分區中的數據從一個表移動到另一個具有相同架構且還沒有該分區的表。

有關此功能的詳細信息,請參閱Exchange分區和hive-4095。

4.4.2.5、    恢復分區(MSCK REPAIR TABLE)

Hive在其metastore存儲每個表的分區列表。然而,如果新的分區被直接加入到HDFS(比方說通過使用hadoop fs -put命令),或從HDFS移除,metastore(因此Hive也)將不知道這些變化,除非用戶在分區表上每次新添或刪除分區時分別運行ALTER TABLE table_name ADD/DROP PARTITION命令。

然而,用戶可以運行與維修表選項的metastore檢查命令:

MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS];

它將更新Hive Metastore中關於分區的元數據,用於那些尚未存在此類元數據的分區。

  • MSC命令的默認選項是ADD PARTITIONS。使用此選項,它將向Metastore添加任何存在於HDFS上但不在Metastore中的分區。
  • DROP PARTITIONS選項將從Metastore中刪除分區信息,對應那些已經從HDFS中刪除的分區。
  • SYNC PARTITIONS選項等效於調用ADD PARTITIONS和DROP PARTITIONS。有關詳細信息,請參閱hive-874和hive-17824。
  • 當有大量未跟蹤分區時,有一項規定可以按批處理方式運行MSCK修復表,以避免OOME(內存不足錯誤)。通過爲屬性hive.msck.repair.batch.size提供配置的批處理大小,它可以在內部批處理中運行。該屬性的默認值爲零,這意味着它將一次執行所有分區。
  • 不帶修復選項的MSCK命令可用於查找元數據錯配的詳細信息。

在Amazon Elastic MapReduce(EMR)版本Hive的等效命令是:

ALTER TABLE table_name RECOVER PARTITIONS;

從Hive 1.3開始,如果分區值中有HDFS目錄不允許的字符,MSCK將拋出異常。在客戶端上使用設置hive.msck.path.validation來改變此行爲;“skip”將簡單地跳過目錄。“ignore”將嘗試創建分區(舊的行爲)。這可能成功,也可能不起作用。

4.4.2.6、    刪除分區

ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec[, PARTITION partition_spec, ...]
  [IGNORE PROTECTION] [PURGE];            -- (Note: PURGE available in Hive 1.2.0 and later, IGNORE PROTECTION not available 2.0.0 and later)

您可以使用ALTER TABLE DROP PARTITION來刪除表的分區。這刪除了用於該分區中的數據和元數據。如果設置了回收策略,數據實際移動到.Trash /當前目錄,除非另外指定PURGE。但元數據完全丟失(見上文的刪除表)。

版本信息:IGNORE PROTECTION

IGNORE PROTECTION不在2.0.0及以後的版本可用。此功能由Hive幾個可用的安全選項之一取代(請參見基於SQL標準的Hive授權)。見HIVE-11145瞭解詳情。

 

對於由NO_DROP CASCADE保護的表,可以使用謂詞IGNORE PROTECTION刪除指定分區或一組分區(例如,在兩個Hadoop集羣之間拆分表時):

ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec IGNORE PROTECTION;

上述命令將刪除該分區,而不考慮保護狀態。

 

版本信息:PURGE

ALTER TABLE的PURGE選項由1.2.1版本添加(HIVE-10934)。

 

如果指定PURGE的清除,則分區的數據不走的.Trash /當前目錄,因此不能在一個失誤刪除的情況下恢復數據:

ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec PURGE;     -- (Note: Hive 1.2.0 and later)

PURGE選項也可以用表屬性中auto.purge指定(見上文的TBLPROPERTIES)。

從Hive0.7.0到更高版本,DROP的分區如果不存在,返回一個錯誤,除非指定IF EXISTS或設置變量hive.exec.drop.ignorenonexistent爲true。

ALTER TABLE page_view DROP PARTITION (dt='2008-08-08', country='us');

4.4.2.7、    分區存檔(和解檔)

ALTER TABLE table_name ARCHIVE PARTITION partition_spec;
ALTER TABLE table_name UNARCHIVE PARTITION partition_spec;

歸檔功能是移動的分區的文件到一個Hadoop歸檔(HAR)。請注意,只是文件的數量減少; HAR不提供任何壓縮。見Language Manual存檔 以瞭解更多信息

4.4.3、  改變表或分區

4.4.3.1、    ALTER TABLE /分區文件格式

ALTER TABLE table_name [PARTITION partition_spec] SET FILEFORMAT file_format;

這個語句更改表(或分區的)文件格式。有關可用file_format選項,看上面的CREATE TABLE部分。此操作只更改表的元數據。任何現有數據的轉換必須Hive外完成。

4.4.3.2、    ALTER TABLE /分區位置

ALTER TABLE table_name [PARTITION partition_spec] SET LOCATION "new location";

4.4.3.3、    ALTER TABLE /分區TOUCH

ALTER TABLE table_name TOUCH [PARTITION partition_spec];

TOUCH讀取的元數據,並將其寫回。這具有使前/後執行掛鉤觸發的效果。一個示例是:如果您有一個鉤子記錄所有已修改的表/分區,以及一個直接更改HDFS上文件的外部腳本。因爲腳本修改了Hive之外的文件,所以這個修改不會被鉤子記錄下來。外部腳本可以調用Touch來觸發鉤子,並將所述表或分區標記爲修改後的表或分區。

另外,如果我們將可靠的最後修改時間合併起來,以後可能會很有用。TOUCH也會更新那個時間。

注意,如果TOUCH的表或分區不存在,它也不會創建表或分區。(請參見創建表。)

4.4.3.4、    改變表/分區保護

版本信息

由Hive0.7.0開始(HIVE-1413)。在HIVE 0.8.0在CASCADE子句加入NO_DROP(HIVE-2605)。

此功能在Hive2.0.0已被刪除。此功能由Hive幾個可用的安全選項之一替代(見基於SQL標準Hive授權)。見HIVE-11145 瞭解詳情。

ALTER TABLE table_name [PARTITION partition_spec] ENABLE|DISABLE NO_DROP [CASCADE];

ALTER TABLE table_name [PARTITION partition_spec] ENABLE|DISABLE OFFLINE;

數據保護可以在任一表或分區級別設置。啓用NO_DROP防止表被刪除。啓用OFFLINE防止查詢表或分區中的數據,但元數據仍然可以被訪問。

如果在一個表中的任何分區NO_DROP啓用,該表不能刪除。相反,如果一個表啓用NO_DROP之後,分區仍然可能被刪除,但NO_DROP CASCADE分區不能被刪除,除非刪除partition命令指定IGNORE PROTECTION。

4.4.3.5、    改變表/分區緊縮

版本信息

在Hive版本0.13.0及後續版本,當事務正在被使用,ALTER TABLE語句可以要求緊縮表或分區。在Hive發佈1.3.0和2.1.0後,當事務正在被使用時,ALTER TABLE ... COMPACT語句可以包括TBLPROPERTIES子句,或者是改變緊縮MapReduce工作屬性或覆蓋任何其他Hive表的屬性。更多細節可以見在這裏

ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])]
  COMPACT 'compaction_type'[AND WAIT]
  [WITH OVERWRITE TBLPROPERTIES ("property"="value" [, ...])];

一般來說,在使用Hive事務時,您不需要請求緊縮,因爲系統將檢測到它們的需要並自動啓動緊縮。但是,如果關閉了表的緊縮功能,或者希望在系統不選擇的情況下緊縮表,則ALTER TABLE可以啓動緊縮。默認情況下,該語句將緊縮請求排隊,然後返回。若要查看緊縮的進度,請使用“SHOW COMPACTIONS”。從Hive2.2.0開始,可以指定“AND WAIT”來讓操作等待緊縮完成。

該compaction_type可以是MAJOR 或者 MINOR。請參閱Hive事務的基本設計部分以獲取更多信息。

4.4.3.6、    改變表/分區串聯

版本信息

在Hive 0.8.0中, 增加了使用串聯命令塊級快速合併小型小RCFiles的支持。在Hive版本0.14.0 ,添加了使用串聯命令條帶(stripe)級別快速合併ORC小文件的支持。

ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] CONCATENATE;

如果表或分區包含許多小的RCFile或ORC文件,那麼上面的命令將它們合併成更大的文件。對於RCFile,合併發生在塊級,而對於ORC文件,合併發生在條帶(stripe)級,從而避免了數據解壓縮和解碼的開銷。

4.4.3.7、    ALTER TABLE /分區更新列

版本信息

在Hive釋放3.0.0中加入該命令,讓用戶同步SERDE存儲模式信息到metastore。

ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] UPDATE COLUMNS;

具有自描述表模式的SERDES表在現實中可能有不同的模式,而存儲在Hive Metastore中的表也可能有不同的模式。例如,當用戶使用模式url或模式文字創建Avro存儲表時,模式將被插入到HMS中,然後無論服務器中的url或文字如何更改,模式都不會在HMS中被更改。這可能導致問題,特別是在與其他Apache組件集成時。

更新列功能爲用戶提供了讓在SERDE所做的任何模式更改能同步到HMS的方式。它適用於表和分區一級,而且顯然只適用於其模式未被HMS跟蹤的表(見metastore.serdes.using.metastore.for.schema)。在這些後來SERDE類型使用命令將導致錯誤。

4.4.4、  ALTER COLUMN

4.4.4.1、    列名規則

列名不區分大小寫。

版本信息

在Hive版本0.12.0及更早版本,列名只能包含字母數字和下劃線字符。

在Hive版本0.13.0及更高版本,默認情況下,列名可以反引號內指定的(`)和含有任何的Unicode字符(HIVE-6013),然而,點(.)和冒號(:)上查詢會觸發錯誤。用反引號內指定的任何列名都按字面處理。在反引號字符串中,用雙反引號(``)來表示一個反引號字符。在0.13.0之前的行爲可以通過設置使用hive.support.quoted.identifiers爲none,在這種情況下反引號名稱被解釋爲正則表達式。有關詳細信息,請參閱在列名中支持帶引號的標識符。

反引號包圍符允許使用保留關鍵字用於列名,以及表名。

4.4.4.2、    更改列名稱/類型/位置/註釋

ALTER TABLE table_name [PARTITION partition_spec] CHANGE [COLUMN] col_old_name col_new_name column_type
  [COMMENT col_comment] [FIRST|AFTER column_name] [CASCADE|RESTRICT];

這個命令將允許用戶更改列的名稱,數據類型,註釋或位置,或者它們的任意組合。PARTITION子句中從Hive0.14.0到更高版本;

CASCADE | RESTRICT子句中可用Hive1.1.0。ALTER TABLE CHANGE COLUMN與CASCADE配合更改表元數據的列,並對所有分區元數據進行相同的更改。RESTRICT是默認的,限制僅表中列的元數據發生變化。

ALTER TABLE CHANGE COLUMN CASCADE子句將覆蓋表/分區相關列的元數據,而不管表或分區的保護模式如何。謹慎使用。

更改列命令將只修改配置單元的元數據,並且不會修改數據。用戶應確保表/分區的實際數據與佈局的元數據定義一致。

例:

CREATE TABLE test_change (a int, b int, c int);

// First change column a's name to a1. ALTER TABLE test_change CHANGE a a1 INT; // Next change column a1's name to a2, its data type to string, and put it after column b. ALTER TABLE test_change CHANGE a1 a2 STRING AFTER b; // The new table's structure is: b int, a2 string, c int. // Then change column c's name to c1, and put it as the first column. ALTER TABLE test_change CHANGE c c1 INT FIRST; // The new table's structure is: c1 int, b int, a2 string. // Add a comment to column a1 ALTER TABLE test_change CHANGE a1 a1 INT COMMENT 'this is column a1';

4.4.4.3、    添加/替換列

ALTER TABLE table_name
  [PARTITION partition_spec]                 -- (Note: Hive 0.14.0 and later)
  ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
  [CASCADE|RESTRICT]                         -- (Note: Hive 1.1.0 and later)

ADD COLUMNS允許您將新列添加到現有列之後,分區列之前。這個特性支持Avro的表, Hive0.14及更高版本。

REPLACE COLUMNS刪除所有現有列,並增加了新的一組列。這隻能是在表是本地SERDE(DynamicSerDe,MetadataTypedColumnsetSerDe,LazySimpleSerDe和ColumnarSerDe)的情況下完成。請參閱HiveSERDE以獲取更多信息。REPLACE COLUMNS還可以用來刪除列。例如,“ ALTER TABLE test_change REPLACE COLUMNS (a int, b int);”將於test_change的模式中刪除列“C”。

PARTITION子句從Hive0.14.0 開始到更高版本;

CASCADE | RESTRICT子句中可用Hive1.1.0。ALTER TABLE CHANGE COLUMN與CASCADE配合更改表元數據的列,並對所有分區元數據進行相同的更改。RESTRICT是默認的,限制僅表中列的元數據發生變化。

ALTER TABLE ADD或REPLACE COLUMNS CASCADE將覆蓋表分區的列的元數據,無視表或分區的的保護模式。請謹慎使用。

列更改命令將只修改配置單元的元數據,並且不會修改數據。用戶應確保表/分區的實際數據與佈局的元數據定義一致。

4.4.4.4、    部分分區規範

從Hive 0.14(hive-8411)開始,用戶就可以爲上述ALTER列語句提供部分分區規範,類似於動態分區。因此,不需要爲需要更改的每個分區發出ALTER列語句:

ALTER TABLE foo PARTITION (ds='2008-04-08', hr=11) CHANGE COLUMN dec_column_name dec_column_name DECIMAL(38,18);
ALTER TABLE foo PARTITION (ds='2008-04-08', hr=12) CHANGE COLUMN dec_column_name dec_column_name DECIMAL(38,18);
...

...您可以使用帶有部分分區規範的單個ALTER語句一次更改許多現有分區:

// hive.exec.dynamic.partition needs to be set to true to enable dynamic partitioning with ALTER PARTITION
SET hive.exec.dynamic.partition = true;
// This will alter all existing partitions in the table with ds='2008-04-08' -- be sure you know what you are doing!
ALTER TABLE foo PARTITION (ds='2008-04-08', hr) CHANGE COLUMN dec_column_name dec_column_name DECIMAL(38,18);
// This will alter all existing partitions in the table -- be sure you know what you are doing!
ALTER TABLE foo PARTITION (ds, hr) CHANGE COLUMN dec_column_name dec_column_name DECIMAL(38,18);

類似動態分區,hive.exec.dynamic.partition必須設置爲true,以便在ALTER分區期間啓用部分分區規範。以下操作支持此操作:

    更改列

    添加列

    更換列

    文件格式

    Serde屬性

五、創建/刪除/更改視圖

    創建視圖

    刪除視圖

    改變視圖屬性

    Alter View As Select

5.1、 創建視圖

CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ...) ]
  [COMMENT view_comment]
  [TBLPROPERTIES (property_name = property_value, ...)]
  AS SELECT ...;

CREATE VIEW創建給定名稱的視圖。如果一個具有相同名稱表或視圖已經存在,則會引發錯誤。您可以使用IF NOT EXISTS跳過錯誤。

如果沒有提供列名,該視圖的列的名稱將被自動地從SELECT子句投影列表達式取得。(如果SELECT包含無別名的標量表達式如X + Y,所得到的視圖列名稱將在形式如_C0,_c1等)。重命名列時,還可以選擇提供列註釋。(註釋不會自動從基礎列繼承)。

如果定義視圖的SELECT表達式是無效的,CREATE VIEW語句將失敗。

注意,視圖是沒有相關聯存儲的純邏輯對象(除了物化視圖,該特性從Hive 2.3.0開始支持。)

當一個查詢引用視圖時,將計算視圖的定義,以便生成一組查詢結果集供進一步處理。(這是一種概念描述;事實上,作爲查詢優化的一部分,Hive可以將視圖的定義與查詢的定義結合起來,例如將過濾器從查詢向下推到視圖中(fan:即Where過濾條件下推至From子句)。)

視圖的模式在視圖創建時被凍結;對底層表的後續更改(例如添加列)將不會反映在視圖的模式中。如果以不兼容的方式刪除或更改基礎表,則隨後查詢無效視圖的嘗試將失敗。

視圖只讀的,也不可以作爲LOAD / INSERT / ALTER的目標。如果需要改變元數據,請參見ALTER VIEW。

視圖可以包含ORDER BY和LIMIT子句。如果引用視圖的查詢也包含這些子句,則在視圖子句之後(以及在查詢中的任何其他操作之後)計算查詢級別的子句。例如,如果視圖指定LIMIT 5,並將引用查詢執行爲(select * from v LIMIT 10),則最多將返回5行。

從Hive 0.13.0開始,視圖的SELECT語句可以包含一個或多個公共表達式(CTE),如SELECT語法所示。有關CREATE VIEW語句中CTE的示例,請參見公共表達式。

例:

CREATE VIEW onion_referrers(url COMMENT 'URL of Referring page')
  COMMENT 'Referrers to The Onion website'
  AS
  SELECT DISTINCT referrer_url
  FROM page_view
  WHERE page_url='http://www.theonion.com';

使用SHOW CREATE TABLE來顯示創建視圖的CREATE VIEW語句。從Hive2.2.0,SHOW VIEWS顯示在數據庫中的視圖列表。

版本信息

最初,視圖的文件格式被硬編碼爲SequenceFile。從Hive2.1.0(HIVE-13736),視圖與表和索引都遵循hive.default.fileFormat和hive.default.fileformat.managed屬性的默認值。

5.2、 刪除視圖

DROP VIEW [IF EXISTS] [db_name.]view_name;

DROP VIEW移除指定視圖元數據。(對視圖使用DROP TABLE是非法的)。

當刪除其他視圖中引用的視圖時,不會給出警告(依賴視圖會非法引用而無效,並必須由用戶刪除或重新創建)。

從Hive0.7.0到更高版本,DROP一個不存在的視圖會返回錯誤,除非指定IF EXISTS或設置變量hive.exec.drop.ignorenonexistent爲true。

例:

DROP VIEW onion_referrers;

5.3、 改變視圖屬性

ALTER VIEW [db_name.]view_name SET TBLPROPERTIES table_properties;
table_properties:
  : (property_name = property_value, property_name = property_value, ...)

與ALTER TABLE一樣,你可以用這個語句給視圖添加自己的元數據。

5.4、 Alter View As Select

ALTER VIEW [db_name.]view_name AS select_statement;

Alter View As Select改變一個已存在視圖的定義。語法類似於用於CREATE VIEW,效果和CREATE OR REPLACE VIEW相同。

注:該視圖必須已經存在,且如果該視圖有分區,它不能用ALTER VIEW AS SELECT所取代。(fan:視圖也可以有分區嗎?)

六、創建/刪除/ ALTER INDEX

本節提供了一個簡要介紹了Hive Index,更詳細的文檔如下:

    Hive索引概述

    索引設計文件

在Hive0.12.0和更早的版本,索引名在CREATE INDEX和DROP INDEX語句中是區分大小寫的。但是,ALTER INDEX需要創建索引的名字是小寫字母(見  HIVE-2752)。此錯誤是在Hive0.13.0修復的,所有HiveQL語句的索引名不再區分大小寫。對於0.13.0之前的版本中,最好的做法是所有索引名都使用小寫字母。

6.1、 創建索引

CREATE INDEX index_name
  ON TABLE base_table_name (col_name, ...)
  AS index_type
  [WITH DEFERRED REBUILD]
  [IDXPROPERTIES (property_name=property_value, ...)]
  [IN TABLE index_table_name]
  [
     [ ROW FORMAT ...] STORED AS ...
     | STORED BY ...
  ]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (...)]
  [COMMENT "index comment"];

CREATE INDEX在表上使用給定的列創建索引。請參閱CREATE INDEX設計文檔。

6.2、 DROP INDEX

DROP INDEX [IF EXISTS] index_name ON table_name;

DROP INDEX刪除索引,以及刪除索引表。

在Hive0.7.0或更高版本中,如果索引不存在,DROP將返回一個錯誤,除非指定了IF EXISTS或設置變量hive.exec.drop.ignorenonexistent  爲true。

6.3、 ALTER INDEX

ALTER INDEX index_name ON table_name [PARTITION partition_spec] REBUILD;

ALTER INDEX ... REBUILD爲使用WITH DEFERRED REBUILD子句的索引建立索引或重建先前建立的索引。如果指定分區,那麼只有該分區重建。

七、創建/刪除宏

Bug修復:

    在Hive1.3.0和2.0.0之前,當處理同一行數據多次調用HiveQL宏時,即使參數是不同,Hive對於所有調用也返回相同的結果。(參見HIVE-11432)。

    在Hive 1.3.0和2.0.0之前,當處理同一行數據調用多個HiveQL宏時, ORDER BY子句可能會給錯誤的結果。(參見HIVE-12277)。

    在Hive2.1.0之前,當處理同一行數據調用多個HiveQL宏時,後面宏的結果會被第一個宏的結果覆蓋。(參見HIVE-13372)。

從Hive0.12.0引入HiveQL宏,之前他們只能在Java中創建。

7.1、 創建臨時宏

CREATE TEMPORARY MACRO macro_name([col_name col_type, ...]) expression;

CREATE TEMPORARY MACRO創建可作爲可選參數化表達式的宏。宏的持續時間存在當前會話中。

例子:

CREATE TEMPORARY MACRO fixed_number() 42;
CREATE TEMPORARY MACRO string_len_plus_two(x string) length(x) + 2;
CREATE TEMPORARY MACRO simple_add (x int, y int) x + y;

7.2、 刪除臨時宏

DROP TEMPORARY MACRO [IF EXISTS] macro_name;

如果宏不存在,DROP TEMPORARY MACRO將返回錯誤,除非指定IF EXISTS。

八、創建/刪除/重新裝載函數

8.1、 臨時函數

8.1.1、  創建臨時函數

CREATE TEMPORARY FUNCTION function_name AS class_name;

使用這個語句允許您創建一個由class_name實現的函數。只要會話持續,就可以在Hive查詢中使用此函數。您可以使用Hive類路徑中的任何類。您也可以通過執行‘Add JAR’語句將JAR添加到類路徑中。

有關如何從Hive類路徑添加/刪除文件的更多信息,請參閱CLI部分Hive Interactive Shell命令,包括Hive參考資料。使用它,您可以註冊用戶定義的函數(UDF)。

有關創建自定義UDF的一般信息,請參見Hive插件。

8.1.2、  刪除臨時函數

您可以按如下刪除UDF:

DROP TEMPORARY FUNCTION [IF EXISTS] function_name;

在Hive0.7.0或更高版本中,如果該函數不存,DROP會返回一個錯誤,除非指定IF EXISTS或設置變量hive.exec.drop.ignorenonexistent爲true。

8.2、 永久函數

在Hive0.13或更高版本中,函數可以註冊到metastore,這樣他們就可以在查詢中引用而無需在每個會話創建臨時函數。

8.2.1、  創建函數

CREATE FUNCTION [db_name.]function_name AS class_name
  [USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];

這個語句允許您創建一個由class_name實現的函數。JAR、文件或檔案可以使用Using子句指定,將其添加到環境中的;當函數第一次被Hive會話引用時,這些資源將被添加到環境中,就像已經發出Add JAR/File一樣。如果Hive沒有處於本地模式,那麼資源位置必須是一個非本地URI,例如HDFS目錄。

該函數將被加入到指定的數據庫,或在該函數的創建時的當前數據庫。該函數可以通過完全限定符的函數名(db_name.function_name)引用,如果函數位於當前數據庫中,則可以不加限定符引用該函數。

8.2.2、  刪除函數

DROP FUNCTION [IF EXISTS] function_name;

如果該函數不存在,DROP返回一個錯誤,除非指定IF EXISTS或設置變量hive.exec.drop.ignorenonexistent爲真。

8.2.3、  重新加載函數

RELOAD FUNCTION;

作爲HIVE-2573,在一個HiveCLI會話創建永久的函數可能不會反映在創建函數之前被啓動的HiveServer2或其他HiveCLI會話中。允許在HiveServer2或HiveCLI會話中執行RELOAD FUNCTION,以便裝載其他HiveCLI會話所做的永久函數的任何變更。

九、創建/刪除/授予/撤銷角色和權限

Hive廢棄的授權模式/Legacy模式,提供了以下DDL語句的信息:

    CREATE ROLE

    GRANT ROLE

    REVOKE ROLE

    GRANT privilege_type

    REVOKE privilege_type

    DROP ROLE

    SHOW ROLE GRANT

    SHOW GRANT

有關Hive 0.13.0和更高版本中基於SQL標準的授權,請參見以下DDL語句:

    角色管理命令

        CREATE ROLE

        GRANT ROLE

        REVOKE ROLE

        DROP ROLE

        SHOW ROLES

        SHOW ROLE GRANT

        SHOW CURRENT ROLES

        SET ROLE

        SHOW PRINCIPALS

    對象權限命令

        GRANT privilege_type

        REVOKE privilege_type

        SHOW GRANT

十、顯示

    顯示數據庫

    顯示錶/視圖/分區/索引

        顯示錶

        顯示視圖

        顯示分區

        顯示錶/分區擴展

        顯示錶屬性

        顯示創建表

        顯示索引

    顯示列

    顯示函數

    顯示授予的角色和權限

    顯示鎖

    顯示配置

    顯示事務

    顯示緊縮

這些語句提供了一種查詢Hive Metastore以獲取該Hive系統中可訪問的現有數據和元數據的方法。

10.1、    顯示數據庫

SHOW (DATABASES|SCHEMAS) [LIKE 'identifier_with_wildcards'];

SHOW DATABASES或SHOW SCHEMAS列出所有在metastore定義的數據庫。SCHEMA和數據庫的用途是可以互換的,他們的含義相同。

可選的LIKE子句允許使用正則表達式篩選數據庫列表。正則表達式中的通配符只能是匹配任意字符的“*”或表示可選的“|”。例如‘employees’、‘emp*’、‘emp*|*ee’,所有這些都將與名爲“employees”的數據庫相匹配。

10.2、    顯示錶/視圖/分區/索引

10.2.1、     顯示錶

SHOW TABLES [IN database_name] ['identifier_with_wildcards'];

SHOW TABLES列出當前數據庫所有的基礎表和視圖(或者使用IN或FROM子句顯式命名的數據庫)。表名與可選的正則表達式匹配。正則表達式中的通配符只能是任意字符的“*”或是表示可選的“|”。例如‘page_view’、‘page_v*’、‘*view|page*’,所有這些都將與‘page_view’視圖相匹配。匹配視圖按字母順序列出。如果在Metastore中沒有找到匹配的視圖,則也不會報錯。如果沒有給出正則表達式,則列出所選數據庫中的所有表和視圖。

10.2.2、     顯示視圖

版本信息

在Hive2.2.0中通過hive-14558引入。

SHOW VIEWS [IN/FROM database_name] [LIKE 'pattern_with_wildcards'];

SHOW VIEWS列出當前數據庫所有的視圖(或使用IN或FROM子句顯式命名的數據庫)。視圖名與可選的正則表達式匹配。正則表達式中的通配符只能是任意字符的“*”或是表示可選的“|”。例如‘page_view’、‘page_v*’、‘*view|page*’,所有這些都將與‘page_view’視圖相匹配。匹配視圖按字母順序列出。如果在Metastore中沒有找到匹配的視圖,則也不會報錯。如果沒有給出正則表達式,則列出所選數據庫中的所有視圖。

例子

SHOW VIEWS;             -- show all views in the current database
SHOW VIEWS 'test_*';    -- show all views that start with "test_"
SHOW VIEWS '*view2';    -- show all views that end in "view2"
SHOW VIEWS LIKE 'test_view1|test_view2';   -- show views named either "test_view1" or "test_view2"
SHOW VIEWS FROM test1; -- show views from database test1
SHOW VIEWS IN test1;   -- show views from database test1 (FROM and IN are same)
SHOW VIEWS IN test1 "test_*"; -- show views from database test2 that start with "test_"

10.2.3、     顯示分區

SHOW PARTITIONS table_name;

SHOW PARTITIONS列出所有給表中現有的分區。分區是按字母順序列出。

版本信息

從Hive 0.6開始,顯示分區可以過濾分區列表,如下所示。

另外,還可以指定一個分區規範的部分來篩選結果列表。

例子:

SHOW PARTITIONS table_name PARTITION(ds='2010-03-03');            -- (Note: Hive 0.6 and later)
SHOW PARTITIONS table_name PARTITION(hr='12');                    -- (Note: Hive 0.6 and later)
SHOW PARTITIONS table_name PARTITION(ds='2010-03-03', hr='12');   -- (Note: Hive 0.6 and later)

版本信息

從Hive0.13.0開始,SHOW分區可以指定一個數據庫(HIVE-5912)。

SHOW PARTITIONS [db_name.]table_name [PARTITION(partition_spec)];   -- (Note: Hive 0.13.0 and later)

例:

SHOW PARTITIONS databaseFoo.tableBar PARTITION(ds='2010-03-03', hr='12');   -- (Note: Hive 0.13.0 and later)

10.2.4、     擴展顯示錶/分區

SHOW TABLE EXTENDED [IN|FROM database_name] LIKE 'identifier_with_wildcards' [PARTITION(partition_spec)];

SHOW TABLE EXTENDED將列出匹配給定正則表達式所有表的信息。如果指定分區標識,則用戶不能對錶名使用正則表達式。此命令的輸出包括像totalNumberFiles,totalFileSize,maxFileSize,minFileSize,LastAccessTime和lastUpdateTime等等基本表信息和文件系統信息。如果分區存在,它將輸出給定分區的文件系統信息,而不是表的文件​​系統信息。

hive> show table extended like part_table;
OK
tableName:part_table
owner:thejas
location:file:/tmp/warehouse/part_table
inputformat:org.apache.hadoop.mapred.TextInputFormat
outputformat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
columns:struct columns { i32 i}
partitioned:true
partitionColumns:struct partition_columns { string d}
totalNumberFiles:1
totalFileSize:2
maxFileSize:2
minFileSize:2
lastAccessTime:0
lastUpdateTime:1459382233000

10.2.5、     顯示錶屬性

SHOW TBLPROPERTIES tblname;
SHOW TBLPROPERTIES tblname("foo");

第一種形式列出了所有的表屬性,每行由製表符分隔。該命令的第二種形式只打印請求屬性的值。

欲瞭解更多信息,請參閱上面創建表的TBLPROPERTIES內容。

10.2.6、     顯示創建表

SHOW CREATE TABLE ([db_name.]table_name|view_name);

SHOW CREATE TABLE展示了創建一個給定的表CREATE TABLE語句,或者展示創建一個給定視圖的CREATE VIEW語句。

10.2.7、     顯示索引

SHOW [FORMATTED] (INDEX|INDEXES) ON table_with_index [(FROM|IN) db_name];

SHOW INDEX顯示特定列上的所有索引,以及有關它們的信息:索引名稱、表名、用作鍵的列名、索引表名稱、索引類型和註釋。如果使用FORMATTED關鍵字,則爲每一列打印列標題,即按列輸出。

10.3、    顯示列

SHOW COLUMNS (FROM|IN) table_name [(FROM|IN) db_name];

SHOW COLUMNS顯示錶中包括分區列的所有列。

 版本信息

SHOW COLUMNS(FROM | IN)TABLE_NAME [(FROM | IN)DB_NAME]  [ LIKE 'pattern_with_wildcards'];

在Hive3.0新增 (HIVE-18373)

SHOW COLUMNS列出表中的所有列,其名稱與可選正則表達式相匹配。正則表達式中只能是匹配任意字符的“*”或表示可選的“|”。例如‘cola’,‘col*’,‘*a|col*’,所有這些都將與‘cola’列相匹配。匹配列按字母順序列出。如果在表中沒有找到匹配的列,也不會報告錯誤。如果沒有給出正則表達式,則列出所選表中的所有列。

 

例子

-- SHOW COLUMNS
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE foo(col1 INT, col2 INT, col3 INT, cola INT, colb INT, colc INT, a INT, b INT, c INT);
  
-- SHOW COLUMNS basic syntax
SHOW COLUMNS FROM foo;                            -- show all column in foo
SHOW COLUMNS FROM foo "*";                        -- show all column in foo
SHOW COLUMNS IN foo "col*";                       -- show columns in foo starting with "col"                 OUTPUT col1,col2,col3,cola,colb,colc
SHOW COLUMNS FROM foo '*c';                       -- show columns in foo ending with "c"                     OUTPUT c,colc
SHOW COLUMNS FROM foo LIKE "col1|cola";           -- show columns in foo either col1 or cola                 OUTPUT col1,cola
SHOW COLUMNS FROM foo FROM test_db LIKE 'col*';   -- show columns in foo starting with "col"                 OUTPUT col1,col2,col3,cola,colb,colc
SHOW COLUMNS IN foo IN test_db LIKE 'col*';       -- show columns in foo starting with "col" (FROM/IN same)  OUTPUT col1,col2,col3,cola,colb,colc
  
-- Non existing column pattern resulting in no match
SHOW COLUMNS IN foo "nomatch*";
SHOW COLUMNS IN foo "col+";                       -- + wildcard not supported
SHOW COLUMNS IN foo "nomatch";

10.4、    顯示函數

SHOW FUNCTIONS "a.*";

SHOW FUNCTIONS列表顯示所有匹配正則表達式的用戶自定義函數和內置函數。要獲得所有函數使用“.*”

10.5、    顯示授予的角色和權限

Hive棄用授權模式/Legacy模式,其具有這些SHOW語句:

    SHOW ROLE GRANT

    SHOW GRANT

在Hive0.13.0及更高版本中,基於標準SQL的授權有以下SHOW語句:

    SHOW ROLE GRANT

    SHOW GRANT

    SHOW CURRENT ROLES

    SHOW ROLES

    SHOW PRINCIPALS

10.6、    顯示鎖

SHOW LOCKS <table_name>;
SHOW LOCKS <table_name> EXTENDED;
SHOW LOCKS <table_name> PARTITION (<partition_spec>);
SHOW LOCKS <table_name> PARTITION (<partition_spec>) EXTENDED;
SHOW LOCKS (DATABASE|SCHEMA) database_name;

SHOW鎖顯示在表或分區上的鎖。有關鎖的信息,請參閱Hive併發模型。

SHOW LOCKS (DATABASE|SCHEMA)從Hive0.13支持數據庫(見HIVE-2093)和從Hive0.14支持SCHEMA(見HIVE-6601)。SCHEMA和數據庫是可以互換的,他們的含義相同。

當Hive正在使用事務時,SHOW LOCKS返回如下信息(見HIVE-6460):

  • 數據庫名稱
  • 表名
  • 分區名稱(如果表是分區表)
  • 鎖處於的狀態,其取值如下:
    •  “持有” - 請求者持有鎖
    •  “等待” - 請求者正在等待鎖
    •  “終止” - 鎖已超時,但還沒有被清理
  • 如果這個鎖處於“等待”狀態,則鎖定該鎖的ID。
  • 鎖的類型,其可以是:
    •  “獨佔” - 沒有人能同時持有鎖(主要由DDL操作獲得,如DROP表)
    •  “shared_read” - 可以在同一時間任意數量的shared_read鎖定相同的資源(通過讀取獲得;令人困惑的是,插入操作也獲得shared_read鎖)
    •  “shared_write” - 可同時任意數量shared_read鎖定同一資源,但不允許其他shared_write(通過更新而獲得和刪除)
  • 與此鎖相關聯的事務ID,如果有的話
  • 上一次持有該鎖的所有者發送心跳時間,可表明它仍然活着
  • 獲取鎖的時間,如果它已被獲取
  • 請求鎖的Hive用戶
  • 用戶運行程序的主機
  • 代理信息——幫助識別發出鎖請求的實體的字符串。對於SQL客戶端來說,這是查詢ID,對於流客戶端來說,它可能是Storm Blot ID(Storm)。

10.7、    顯示CONF

SHOW CONF <configuration_name>;

SHOW CONF返回指定配置屬性的描述。

    默認值

    需要的類型

    描述

需要注意的是,SHOW CONF不顯示配置屬性的當前值。對於當前屬性的設置,在CLI或HiveQL腳本、在Beeline中使用“set”命令(請參閱命令)(見Beeline Hive命令)。

10.8、    顯示事務

SHOW TRANSACTIONS;

SHOW TRANSACTIONS供管理員在啓用Hive事務時使用。它返回系統中所有當前打開和中止的事務列表,包括以下信息:

  •     事務ID
  •     事務狀態
  •     啓動事務的用戶
  •     事務開始的服務器
  •     當事務開始的時間戳(自Hive2.2.0開始)
  •     最後一次心跳檢測的時間戳(自Hive2.2.0開始 )

10.9、    顯示Compactions

SHOW COMPACTIONS;

當啓用Hive事務時,SHOW COMPACTIONS返回當前正在緊縮或計劃緊縮的表和分區的列表,包括以下信息:

  •  “CompactionId” – 唯一標識的內部ID(從Hive3.0開始)
  •  “Database” - Hive數據庫名稱
  •  “Table” - 表名
  •  “Partition” - 分區名稱(如果表是分區表)
  •  “Type” - 無論是最大或最小的緊縮
  •  “State” – 緊縮任務所處的狀態,可以是:
    •  “初始化” - 在隊列中等待緊縮
    •  “工作中” – 正在緊縮
    •  “準備清理” - 緊縮已經完成,舊文件正安排清潔
    •  “失敗” - 任務失敗。metastore日誌中將有更多的細節。
    •  “成功” - OK
    •  “嘗試中” - 試圖安排緊縮,但失敗了。metastore日誌中將有更多的信息。
  •   “Worker” - 做緊縮工作者線程(只有在工作狀態)的線程ID
  •   “開始時間” - 在該緊縮的開始時間(僅當在工作或準備清洗的狀態)
  •   “持續時間(毫秒)” –緊縮所用的時間(從Hive2.2 )
  •   “HadoopJobId” -提交的Hadoop的工作標識(從Hive2.2)

緊縮都是自動啓動的,但也可以用ALTER TABLE COMPACT語句手動啓動。

十一、    描述

11.1、    描述數據庫

DESCRIBE DATABASE [EXTENDED] db_name;
DESCRIBE SCHEMA [EXTENDED] db_name;

DESCRIBE DATABASE顯示數據庫的名稱,它的註釋(如果已設置)和在文件系統的根目錄位置。

SCHEMA和DATABASE的用途是可以互換的,他們的含義相同。

DESCRIBE SCHEMA在Hive1.1.0加入(HIVE-8803)。

EXTENDED也顯示了數據庫性屬性DBPROPERTIES。

11.2、    Hive2.0+:語法變化

Hive2.0+:新語法

在Hive2.0發佈以後,描述表的命令語法有變化,並不向後兼容。詳見HIVE-12184。

DESCRIBE [EXTENDED | FORMATTED]
    [db_name.]table_name [PARTITION partition_spec] [col_name ( [.field_name] | [.'$elem$'] | [.'$key$'] | [.'$value$'] )* ];

警告:新語法可能影響到當前的腳本。

    不再接受表名和列名之間用點分隔,他們必須要空格分開。DB和TABLENAME用點分隔。複雜類型數據的列名仍然可以包含點。

    可選partition_spec必須出現在表名之後、可選的列之前加入。而在之前的語法中,列名出現在表名和partition_spec之間。

例子:

DESCRIBE FORMATTED default.src_table PARTITION (part_col = 100) columnA;
DESCRIBE default.src_thrift lintString.$elem$.myint;

11.3、    描述表/視圖/列

DESCRIBE [EXTENDED|FORMATTED]
  [db_name.]table_name[ col_name ( [.field_name] | [.'$elem$'] | [.'$key$'] | [.'$value$'] )* ];

DESCRIBE語句顯示給定表包括分區列在內的所有列,如果使用了Extended關鍵字,則以Thrift序列化形式顯示錶的元數據,這通常只對調試有用,而不適用於一般用途。如果使用Formatted關鍵字,則以表格形式顯示元數據。

注意:DESCRIBE EXTENDED僅顯示在數據加載時收集統計信息(請參閱新創建的表),以及使用HiveCLI而不是Thrift客戶端或Beeline時統計的行數。HIVE-6285將解決這個問題。儘管Analysis Table可以在加載數據後收集統計信息(請參閱現有表),但目前DESCRIBE EXTENDED沒有提供有關行數的信息。

如果表擁有複合類型的列,可以通過使用表名 複合列名(field_name用於結構,'$elem$'用於數組,'$key$'用於map的鍵,'$value$'用於map的鍵值)查看該列的屬性。您可以遞歸地指定這一語法,以剖析更復雜的列類型。

對於視圖,可以使用DESCRIBE EXTENDED或FORMATTED來獲取視圖的定義。提供了兩個相關屬性:由用戶指定的原始視圖定義和Hive內部使用的擴展定義。

 

版本信息 - 分區和非分區列

在Hive 0.10.0和更早版本中,在顯示描述表的列時,不區分分區列和非分區列,從Hive 0.12.0開始,它們分別顯示。

在Hive 0.13.0及更高版本中,配置參數hive.display.partion.cols.separately允許您使用舊的行爲,詳見Hive6689。有關示例,請參見用於Hive-6689修補程序中的測試用例。

 

修復bug於Hive0.10.0 - 數據庫限定符

在Hive0.7.0中引入了表名的數據庫限定符,但是在Hive0.10.0(hive-1977)中的bug修復之前,表名的數據庫限定符會破環DESCRIBE。

 

修復bug於Hive0.13.0 - 帶引號的標識符

在Hive 0.13.0之前,DESCRIBE沒有接受反引號(')包圍的表標識符,因此不能將DESCRIBE用於與保留關鍵字(hive-2949和hive-6187)匹配的表名。

從0.13.0開始,當配置參數hive.support.quoted.identifiers的默認值爲“column”時(hive-6013),反引號包圍內的所有標識符被字面處理。唯一的例外是雙反引號 (``)表示單個反引號字符。

11.4、    描述分區

DESCRIBE [EXTENDED | FORMATTED]
[db_name.]table_name [PARTITION partition_spec]

此語句列出給定分區的元數據。輸出與Describe TABLE_NAME的輸出類似。目前,在準備計劃時不使用與特定分區相關聯的列信息。從Hive1.2(hive-10307)開始,當hive.typecheck.on.insert設置爲true(默認),partition_spec中指定的分區列的值將被驗證、轉換並歸一化爲其列類型。這些值可以是數字字符串。

例:

hive> show partitions part_table;
OK
d=abc
 
 
hive> DESCRIBE extended part_table partition (d='abc');
OK
i                       int                                        
d                       string                                     
                  
# Partition Information         
# col_name              data_type               comment            
                  
d                       string                                     
                  
Detailed Partition Information  Partition(values:[abc], dbName:default, tableName:part_table, createTime:1459382234, lastAccessTime:0, sd:StorageDescriptor(cols:[FieldSchema(name:i, type:int, comment:null), FieldSchema(name:d, type:string, comment:null)], location:file:/tmp/warehouse/part_table/d=abc, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}, skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), storedAsSubDirectories:false), parameters:{numFiles=1, COLUMN_STATS_ACCURATE=true, transient_lastDdlTime=1459382234, numRows=1, totalSize=2, rawDataSize=1})  
Time taken: 0.325 seconds, Fetched: 9 row(s)
 
 
hive> DESCRIBE formatted part_table partition (d='abc');
OK
# col_name              data_type               comment            
                  
i                       int                                        
                  
# Partition Information         
# col_name              data_type               comment            
                  
d                       string                                     
                  
# Detailed Partition Information                
Partition Value:        [abc]                   
Database:               default                 
Table:                  part_table              
CreateTime:             Wed Mar 30 16:57:14 PDT 2016    
LastAccessTime:         UNKNOWN                 
Protect Mode:           None                    
Location:               file:/tmp/warehouse/part_table/d=abc    
Partition Parameters:           
        COLUMN_STATS_ACCURATE   true               
        numFiles                1                  
        numRows                 1                  
        rawDataSize             1                  
        totalSize               2                  
        transient_lastDdlTime   1459382234         
                  
# Storage Information           
SerDe Library:          org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe      
InputFormat:            org.apache.hadoop.mapred.TextInputFormat        
OutputFormat:           org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat      
Compressed:             No                      
Num Buckets:            -1                      
Bucket Columns:         []                      
Sort Columns:           []                      
Storage Desc Params:            
        serialization.format    1                  
Time taken: 0.334 seconds, Fetched: 35 row(s)

11.5、    顯示列統計信息

版本信息

截止到Hive0.14.0,見HIVE-7050和HIVE-7051。(ANALYZE TABLE的選項FOR COLUMNS 從Hive0.10.0開始)。

ANALYZE TABLE table_name COMPUTE STATISTICS FOR COLUMNS將計算指定表中所有列的列統計信息(如果對錶進行分區,則計算所有分區)。要查看收集的列統計信息,可以使用以下語句:

DESCRIBE FORMATTED [db_name.]table_name column_name;                             

DESCRIBE FORMATTED [db_name.]table_name PARTITION (partition_spec) column_name;   

見Hive統計:可以對現有表執行ANALYZE TABLE命令取得有關的詳細信息。

十二、    終止事務

版本信息

從Hive1.3.0到2.1.0 (見Hive事務)。

ABORT TRANSACTIONS transactionID [ transactionID ...];

ABORT TRANSACTIONS是從Hive Metastore中清除指定事務的ID,這樣用戶就不需要直接與Metastore交互就可以刪除懸空或失敗的事務。中止事務在Hive1.3.0和2.1.0中加入(HIVE-12634)。

例:

ABORT TRANSACTIONS 0000007 0000008 0000010 0000015;

這個命令可以與使用SHOW TRANSACTIONS配合使用。後者可以幫助找出被清理的候選事務ID。

 

翻譯說明

1、版本信息

     除非版本是1.2以上,過濾諸如 “Version Information As of Hive 0.9”之類的信息

    2、個別術語保持英文,如:

    Schema

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章