1. 程式人生 > >Hive 官方手冊翻譯 -- Hive DDL(資料定義語言)

Hive 官方手冊翻譯 -- Hive DDL(資料定義語言)

Hive DDL(資料定義語言)

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

原文連結

翻譯: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傾斜

相關推薦

Hive 官方手冊翻譯 -- Hive DDL(資料定義語言)

Hive DDL(資料定義語言) Confluence Administrator建立, Janaki Lahorani修改於 2018年9月19日 原文連結 翻譯:Google Google翻譯,金山軟體 金山詞霸 校對:南大通用 範振勇 (2018.9.26) 一、概述 這裡是HiveQL

Hive 官方手冊翻譯 -- Hive DML(資料操縱語言)

由 Confluence Administrator建立, 最終由 Lars Francke修改於 八月 15, 2018 原文連結 翻譯:Google Google翻譯,金山軟體 金山詞霸 校對:南大通用 範振勇 (2018.10.6) 在Hive中,有多種方式修改資料:     LOAD

Hive 官方手冊翻譯 -- Hive DML(數據操縱語言)

數據 john 例如 format href hadoop efault 雜類 輸入格式 由 Confluence Administrator創建, 最終由 Lars Francke修改於 八月 15, 2018 原文鏈接 https://cwiki.apache.or

Hive 官方手冊翻譯 -- Hive Transactions (Hive 事務)

由 Alan Gates建立, 最終由 Andrew Sherman修改於2018年8月7日 翻譯:Google Google翻譯,金山軟體 金山詞霸 校對:南大通用 範振勇 (如有翻譯問題,請多指教) 一、Hive 3的警告   升級到Hive 3.0時,由之前版本建立的任何事務性表都需要在每個

HiveDDL資料定義(二)表的修改和刪除

重命名錶 語法 ALTER TABLE table_name RENAME TO new_table_name 案例 hive (hive)> alter table dept_partition2 rename to dept_partition3;

HiveDDL資料定義(一)資料庫操作以及建立表

建立資料庫 建立一個數據庫,資料庫在HDFS上的預設儲存路徑是/user/hive/warehouse/*.db。 hive (default)> create database db_hive; 避免要建立的資料庫已經存在錯誤,增加if not exists判斷。(

HiveDDL資料定義和DML資料操作

Hive資料型別 Java資料型別 Hive資料型別 長度 byte TINYINT 1byte short SMALINT 2byte int INT 4byte long BIGINT 8byte float FLOAT 單精度浮點數 double DOUBLE 雙精度浮點數 stri

Hive(5)-DDL資料定義

一. 建立資料庫 CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES (property_name=property_value

Hive(4):Hive常用資料操縱語言DML,資料定義語言DDL資料控制語言DCL

一、概述 1.DML(data manipulation language):        它們是SELECT、UPDATE、INSERT、DELETE,就象它的名字一樣,這4條命令是用來對資料庫裡的資料進行操作的語言 2.DDL(data definition la

Hive-DDL資料定義

1、建立資料庫 1)建立一個數據庫,資料庫在 HDFS 上的預設儲存路徑是/user/hive/warehouse/*.db。 2)建立一個數據庫,指定資料庫在 HDFS 上存放的位置。 2、修改資料庫 使用者可以使用 ALTER DATABASE 命令為某個資料庫的 D

HiveDDL資料定義

1 建立資料庫 1)建立一個數據庫,資料庫在HDFS上的預設儲存路徑是/user/hive/warehouse/*.db。 hive (default)> create database db_hive; 2)避免要建立的資料庫已經存在錯誤,增加if not exists判斷。(標

HiveQL 資料定義語言使用(一)—Hive中資料庫的建立、顯示、刪除和修改操作介紹

問題導讀:          1、建立資料庫命令中DATABASE可以被哪個關鍵字代替使用?          2、在建立資料庫的時候如何指定資料庫存放路徑?          3、如果一個數據庫中含有表,那麼刪除該資料庫有哪兩種方式?          4、刪除資料庫命令

Hive 官方手冊學習(一) Hive命令列

一、shell視窗下Hive命令列選項 hive [-hiveconf x=y]* [<-i filename>]* [<-f filename>|<-e query-string>] [-S] [-v] 注意:順序

oracle資料庫資料定義語言DDL

1.使用create建立表 1)表中欄位常用的資料型別:1:vachar2(可變長度的字串)、char(定長的字串)、nvachar2(unicode字符集的可變長度的字串)、nchar(unicode的定長的字串)、long(變長的字串)2:數字型:number(p,s)最大精度38位的十進位

MySQL基礎系列之 DDL 資料定義語句大全

連線資料庫 mysql -u [使用者名稱] -h[host] -P[埠號] -p[密碼] mysql -u root -h【127.0.0.1】 -P3306 -p123456 檢視資料庫SHOW DATABASES databases 使用或切換資料庫 USE [資料庫名]

DDL資料定義(二)表的分割槽

分割槽表 原理: 分割槽表實際上就是對應一個HDFS檔案系統上的獨立的資料夾,該資料夾下是該分割槽所有的資料檔案,Hive中的分割槽就是分目錄,把一個大的資料集根據業務需要分割成小的資料集,在查詢時,通過WHERE子句中表達式選擇查詢需要的指定分割槽,這樣查詢的效率高很多

<MySQL>入門三 資料定義語言 DDL

-- DDL 資料定義語言 /* 庫和表的管理 一.庫的管理:建立、修改、刪除 二.表的管理:建立、修改、刪除 建立:create 修改:alter 刪除:drop */ 1.庫的管理 -- 庫的管理 -- 1.庫的建立

DDL)Data Define Language資料定義語言

#DDL Data Define Language資料定義語言 關鍵字:create、alter、drop 庫的管理 表的管理 #一、庫的管理 #1、建立庫 #語法:create database [

mysql資料定義語言(DDL)庫和表(建立庫、建立表)

mysql資料定義語言(DDL)庫和表(建立庫、建立表) 我就直接po截圖和程式碼了,程式碼中有註釋 # SHOW VARIABLES WHERE variable_name = 'datadir'; SHOW VARIABLES WHERE variable_name LIKE

資料定義語言DDL) 和資料操縱語言(DML)

資料定義語言(DDL)資料定義語言用於改變資料庫結構,包括建立、更改和刪除資料庫物件用於操縱表結構的資料定義語言命令有:    CREATE TABL (建立表)    ALTER TABLE(修改表)    TRUNCATE TABLE(刪除表中資料)    DROP TA