HiveQL 语言手册 DDL篇

概览

HiveQL DDL 所包含的表达式语句如下:

  • CREATE DATABASE/SCHEMA, TABLE, VIEW, FUNCTION, INDEX
  • DROP DATABASE/SCHEMA, TABLE, VIEW, INDEX
  • TRUNCATE TABLE
  • ALTER DATABASE/SCHEMA, TABLE, VIEW
  • MSCK REPAIR TABLE (or ALTER TABLE RECOVER PARTITIONS)
  • SHOW DATABASES/SCHEMAS, TABLES, TBLPROPERTIES, VIEWS, PARTITIONS, FUNCTIONS, INDEX[ES], COLUMNS, CREATE TABLE
  • DESCRIBE DATABASE/SCHEMA, table_name, view_name, materialized_view_name

可选

PARTITION 语句通常是 TABLE 语句的可选项,除了SHOW PARTITIONS。

关键字

所有关键字
版本非保留关键字保留关键字
Hive 1.2.0ADD, 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, YEARALL, 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
Hive 2.0.0移除: REGEXP, RLIKE
添加: AUTOCOMMIT, ISOLATION, LEVEL, OFFSET, SNAPSHOT, TRANSACTION, WORK, WRITE
添加:COMMIT, ONLY, REGEXP, RLIKE, ROLLBACK, START
Hive 2.1.0添加:ABORT, KEY, LAST, NORELY, NOVALIDATE, NULLS, RELY, VALIDATE添加:CACHE, CONSTRAINT, FOREIGN, PRIMARY, REFERENCES
Hive 2.2.0添加: DETAIL, DOW, EXPRESSION, OPERATOR, QUARTER, SUMMARY, VECTORIZATION, WEEK, YEARS, MONTHS, WEEKS, DAYS, HOURS, MINUTES, SECONDS添加:DAYOFWEEK, EXTRACT, FLOOR, INTEGER, PRECISION, VIEWS
Hive 3.0.0添加:TIMESTAMPTZ, ZONE 添加:TIME, NUMERIC, SYNC

版本信息

REGEXP 和 RLIKE 是 Hive 2.0.0 之前的非保留关键字,从Hive 2.0.0 (Hive -11703)开始改为保留关键字。

为减少程序中的语义冲突,从 Hive1.2.0 版本开始大多数非保留关键字被加入到保留关键字中。但是如果用户仍想使用保留关键字作为标识符,有两种方法:

  1. 使用反撇号(`)将关键字包裹(指键盘Esc下面的那个符号)
  2. 通过设置绕过关键字校验,set hive.support.sql11.reserved.keywords=false. (这需要 Hive 2.1.0 之后的版本)

Create/Drop/Alter/Use Database

Create Database

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

版本信息

在Hive 0.6 (Hive -675)中,添加了CREATE DATABASE子句。

在Hive 0.7 (Hive -1836)中,添加了WITH DBPROPERTIES子句。

在Hive 4.0.0 (HIVE-22995)中,添加了MANAGEDLOCATION子句 。

  • SCHEMADATABASE的用法相同,在Hive中它们所传达的意思是一致的。
  • COMMENT用于数据库添加注释。
  • LOCATION用于指定外部表的默认路径。
  • MANAGEDLOCATION用于指定内部表的默认路径。
  • WITH DBPROPERTIES用于为数据库添加其他属性。

使用建议

在设置MANAGEDLOCATION的位置时,尽量使其位于metastore.warehouse.dir(Hive数据库文件存放的根目录)中,这样所有内部表都有一个共同的根目录,有助于有公共管理。可以通过设置metastore.warehouse.tenant.colocation 使其他使用者有一个属于自己的根目录,使其与公共目录分离开,以便管理。

Drop Database

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

版本信息

在Hive 0.6 (Hive -675)中,添加了DROP DATABASE子句 。

在Hive 0.8 (HIVE-2090)中,添加了RESTRICT | CASCADE子句。

  • SCHEMADATABASE的用法相同,在Hive中它们所传达的意思是一致的。
  • 在执行Drop Database时,默认使用 RESTRICT模式,在该模式下,如果删除的数据库非空,则会执行失败,从而保护数据库被误删。
  • 如果想要在删除库的同时也将库中所有的表删除,需要使用DROP DATABASE ... CASCADE语句(暴力操作,慎用)。

Alter Database

-- (Note: SCHEMA added in Hive 0.14.0)
ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, ...);   

-- (Note: Hive 0.13.0 and later; SCHEMA added in Hive 0.14.0)
ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role;   

-- (Note: Hive 2.2.1, 2.4.0 and later)
ALTER (DATABASE|SCHEMA) database_name SET LOCATION hdfs_path; 

-- (Note: Hive 4.0.0 and later)
ALTER (DATABASE|SCHEMA) database_name SET MANAGEDLOCATION hdfs_path; 

版本信息

在Hive 0.14 (HIVE-6601)中添加了ALTER SCHEMA

  • SCHEMADATABASE的用法相同,在Hive中它们所传达的意思是一致的。
  • ALTER DATABASE…SET LOCATION语句,用于修改数据库下外表的默认存储目录。不会将数据库当前已存在的目录及文件移动到新指定的位置,只有在该数据库中添加新表时使用修改后的默认目录。
  • ALTER DATABASE…SET MANAGEDLOCATION语句,用于修改数据库下内表的默认存储目录。不会将数据库当前已存在的目录及文件移动到新指定的位置,只有在该数据库中添加新表时使用修改后的默认目录。

TIP

除了上述的这些元数据外,数据库的其他元数据不支持在创建后再修改。

Use Database

USE database_name;
USE DEFAULT;

版本信息

在Hive 0.6 (HIVE-675)中添加了USE database_name

  • USE DATABASE_NAME,为所有后续HiveQL语句设置指定数据库。
  • USE DEFAULT,将数据库切换为DEFAULT数据库。
  • SELECT current_database(),查看当前所属数据库 (在Hive 0.13.0之后可用)。

Create/Drop/Alter Connector

Create Connector

CREATE CONNECTOR [IF NOT EXISTS] connector_name
  [TYPE datasource_type]
  [URL datasource_url]
  [COMMENT connector_comment]
  [WITH DCPROPERTIES (property_name=property_value, ...)];

版本信息

从Hive 4.0.0(Hive -24396)开始,添加了对Data connectors的支持。支持基于JDBC的Connector(如MYSQL、POSTGRES、DERBY)。后续将逐步添加其他类型的Connector。

  • TYPE - 用于指定远程数据源的类型。如:MYSQL。该类型决定了驱动程序类和可用的数据源参数。
  • URL - 远程数据源的URL。 JDBC 数据源,填写 JDBC URL。Hive数据源,填写Thrift URL。
  • COMMENT - 连接器的注释及描述。
  • DCPROPERTIES:连接器的相关属性设置,每个属性设定均由一组Key/Value组成。

Drop Connector

DROP CONNECTOR [IF EXISTS] connector_name;

版本信息

从Hive 4.0.0 via HIVE-24396开始。即便该Connector已经映射了数据库,执行drop时仍会成功。但在执行show tables之类的ddl语句时,用户将看到错误(Connector已不存在)。

Alter Connector

ALTER CONNECTOR connector_name SET DCPROPERTIES (property_name=property_value, ...);
 
ALTER CONNECTOR connector_name SET URL new_url;
  
ALTER CONNECTOR connector_name SET OWNER [USER|ROLE] user_or_role;

版本信息

从Hive 4.0.0 via HIVE-24396开始,支持ALTER Connector相关的操作。

  • ALTER CONNECTOR ... SET DCPROPERTIES ,修改现有的Connector属性。
  • ALTER CONNECTOR ... SET URL, 替换远程数据源URL。使用连接器创建的REMOTE数据库都将继续工作,因为它们是按名称关联的。
  • ALTER CONNECTOR ... SET OWNER ,更改hive中连接器的所有者。

Create/Drop/Truncate Table

Create Table

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name    -- (Note: TEMPORARY available in Hive 0.14.0 and later)
  [(col_name data_type [column_constraint_specification] [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, ...)                  -- (Note: Available in Hive 0.10.0 and later)]
     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 (...)]  -- (Note: Available in Hive 0.6.0 and later)
  ]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (property_name=property_value, ...)]   -- (Note: Available in Hive 0.6.0 and later)
  [AS select_statement];   -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)
 
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  -- (Note: Available in Hive 0.7.0 and later)
 
primitive_type
  : TINYINT
  | SMALLINT
  | INT
  | BIGINT
  | BOOLEAN
  | FLOAT
  | DOUBLE
  | DOUBLE PRECISION -- (Note: Available in Hive 2.2.0 and later)
  | STRING
  | BINARY      -- (Note: Available in Hive 0.8.0 and later)
  | TIMESTAMP   -- (Note: Available in Hive 0.8.0 and later)
  | DECIMAL     -- (Note: Available in Hive 0.11.0 and later)
  | DECIMAL(precision, scale)  -- (Note: Available in Hive 0.13.0 and later)
  | DATE        -- (Note: Available in Hive 0.12.0 and later)
  | VARCHAR     -- (Note: Available in Hive 0.12.0 and later)
  | CHAR        -- (Note: Available in Hive 0.13.0 and later)
 
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, ... >  -- (Note: Available in Hive 0.7.0 and later)
 
row_format
  : DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
        [NULL DEFINED AS char]   -- (Note: Available in Hive 0.13 and later)
  | 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      -- (Note: Available in Hive 0.6.0 and later)
  | ORC         -- (Note: Available in Hive 0.11.0 and later)
  | PARQUET     -- (Note: Available in Hive 0.13.0 and later)
  | AVRO        -- (Note: Available in Hive 0.14.0 and later)
  | JSONFILE    -- (Note: Available in Hive 4.0.0 and later)
  | INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname
 
column_constraint_specification:
  : [ PRIMARY KEY|UNIQUE|NOT NULL|DEFAULT [default_value]|CHECK  [check_expression] ENABLE|DISABLE NOVALIDATE RELY/NORELY ]
 
default_value:
  : [ LITERAL|CURRENT_USER()|CURRENT_DATE()|CURRENT_TIMESTAMP()|NULL ] 
 
constraint_specification:
  : [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ]
    [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ]
    [, CONSTRAINT constraint_name FOREIGN KEY (col_name, ...) REFERENCES table_name(col_name, ...) DISABLE NOVALIDATE 
    [, CONSTRAINT constraint_name UNIQUE (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ]
    [, CONSTRAINT constraint_name CHECK [check_expression] ENABLE|DISABLE NOVALIDATE RELY/NORELY ]

CREATE TABLE 创建给定名称的表。如果已经存在同名的表或视图,则抛出异常。可以使用IF NOT EXISTS来跳过这个错误。

  • 在建表时,表名和列名不区分大小写,但是SerDeproperty 的内容区分大小写

    • 在Hive 0.12及更早的版本,表名和列名中只允许使用字母数字和下划线字符。
    • 在Hive 0.13及以后的版本,列名可以使用所有的Unicode字符(参见HIVE-6013),注:(除了点和冒号,这会使查询报错,因此在Hive 1.2.0中不允许使用它们(参见HIVE-10120))。如果在表名或列名中使用到了特殊字符或保留关键字,可以使用反撇号(`)包裹,这样就可以强制使用了。
    • 如果想要恢复到Hive 0.13之前的设定,即将列名限制为只允许字母数字和下划线字符,可通过配置属性来启用hive.support.quotes.identifiers=none。启用该配置后,反撇号(`)包含的内容将被解释为正则表达式。有关更多详细信息,请参见Supporting Quoted Identifiers in Column Names
  • 表及列的注释都是字符型的 (需要用单引号引用)。

  • 建表时如果不使用EXTERNAL创建,默认建出来的就是内表,并由Hive管理它的数据。

    • 要确定某个表是内部表的还是外部表,可以使用 DESCRIBE EXTENDED table_name 进行查看。
  • TBLPROPERTIES子句,允许用户添加表属性,通过key/value的形式对其标记。表默认存在一些预定义的表属性,如last_modified_userlast_modified_time,这些属性是由Hive自动添加和管理的。其他预定义的表属性包括:

    • TBLPROPERTIES ("comment"="table_comment")
    • TBLPROPERTIES ("hbase.table.name"="table_name")
    • TBLPROPERTIES ("immutable"="true") or ("immutable"="false")
    • TBLPROPERTIES ("orc.compress"="ZLIB") or ("orc.compress"="SNAPPY") or ("orc.compress"="NONE") and other ORC properties
    • TBLPROPERTIES ("transactional"="true") or ("transactional"="false")
    • TBLPROPERTIES ("NO_AUTO_COMPACTION"="true") or ("NO_AUTO_COMPACTION"="false"),
    • TBLPROPERTIES ("compactor.mapreduce.map.memory.mb"="mapper_memory")
    • TBLPROPERTIES ("compactorthreshold.hive.compactor.delta.num.threshold"="threshold_num")
    • TBLPROPERTIES ("compactorthreshold.hive.compactor.delta.pct.threshold"="threshold_pct")
    • TBLPROPERTIES ("auto.purge"="true") or ("auto.purge"="false")
    • TBLPROPERTIES ("EXTERNAL"="TRUE")
    • TBLPROPERTIES ("external.table.purge"="true")
  • 在建表时,如果要为表指定数据库,有两种方法:

    • 在执行CREATE TABLE语句前,使用USE database_name语句指定数据库(Hive 0.6及以后版本支持),如果不指定创建的表默认将归属default数据库。
    • 在执行CREATE TABLE语句时,在建表语句中加入数据库名(Hive 0.7及以后版本支持),格式为:database_name.table.name

Storage Formats

Hive支持内置的几种文件格式,同时也支持自定义开发的文件格式。有关压缩表存储的详细信息,请参阅CompressedStorage。

以下是Hive内置的一些格式:

存储格式描述
STORED AS TEXTFILE存储为纯文本文件。TEXTFILE 是默认的存储格式,如果想修改Hive的默认存储格式,通过hive.default.fileformat参数进行调整。

使用DELIMITED中的定义,读取带分隔符的文件。

通过使用escaping by(例如escape by '\')为分隔符启用转义,如果要处理包含这些分隔符字符的数据,则需要转义。

还可以使用NULL DEFINED AS(默认为'\N')指定自定义NULL格式。

(Hive 4.0)表中的所有二进制列都被假设为base64编码。以原始字节的形式读取数据:
TBLPROPERTIES ("hive.serialization.decode.binary.as.base64"="false")
STORED AS SEQUENCEFILE存储为压缩序列文件。
STORED AS ORC存储为ORC文件格式。支持ACID事务和基于成本的优化器(CBO)。列式模式存储数据。
STORED AS PARQUET存储为Parquet文件格式。Hive 0.13.0 之后的版本支持。
STORED AS AVRO存储为Avro文件格式。Hive 0.14.0 之后的版本支持 (更多参阅Avro SerDe)。
STORED AS RCFILE存储为 Record Columnar File 文件格式。
STORED AS JSONFILE存储为Json文件格式。Hive 4.0.0及以上版本支持
STORED BY存储为non-native table格式。例如 HBaseDruidAccumulo。 (更多参阅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"'

Row Formats & SerDe

用户可以通过自定义序列化类或使用Hive自带的序列化类创建表。如果未指定ROW FORMATROW FORMAT DELIMITED,则使用默认的序列化格式。 使用SERDE创建带有自定义SerDe的表。关于SerDes的更多信息,请参阅:

有关SerDes的更多信息,参阅开发指南中的Hive SerDe

有关输入和输出处理的详细信息,参阅SerDe

要更改表的SerDe或SERDEPROPERTIES,可参考使用本文Add SerDe Properties章节中所述的ALTER TABLE语句。

RegEx

-- 存储为纯文本文件,由正则表达式翻译。
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES
(
"input.regex" = "<regex>"
)
STORED AS TEXTFILE;

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;

JSON

-- 存储为JSON格式的纯文本文件
ROW FORMAT SERDE
'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS TEXTFILE

-- JSON文件的JsonSerDe在Hive 0.12及以后版本中可用。
-- 在某些发行版中,需要引用hive-hcatalog-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之前的版本,可以在s3://elasticmapreduce/samples/hive-ads/libs/jsonserde.jar找到Amazon SerDe。

-- JSON文件的JsonSerDe在Hive 0.12及以后版本中可用。
-- 从Hive 3.0.0开始,JsonSerDe以“org.apache.hadoop.hive.serde2”的形式添加到Hive Serde中(HIVE-19211)
CREATE TABLE my_table(a string, b bigint, ...)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.JsonSerDe'
STORED AS TEXTFILE;

-- 从Hive 4.0.0 (Hive -19899)开始支持STORED AS JSONFILE,因此可以创建如下表:
CREATE TABLE my_table(a string, b bigint, ...) STORED AS JSONFILE;

CSV/TSV

-- CSV/TSV格式纯文本文件
-- CSVSerde在Hive 0.14及更高版本中可用。
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.OpenCSVSerde'
STORED AS TEXTFILE

-- 下面的示例创建一个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;

Partitioned Tables

使用Partitioned BY创建的表称之为分区表。一个表可以有一个或多个分区列,分区列中的每个不同值组合都会创建一个单独的数据目录。

此外,可以使用CLUSTERED BY列对表或分区进行分桶,并且可以通过SORT BY对该分桶数据进行排序,用于提高某些查询的性能。

Example:

-- 分区表建表示例
/*该语句创建了包含viewTime、userid、page_url、referrer_url和ip列(包括注释)的page_view表
  表也被分区,分区字段为dt、country
  数据存储格式为SEQUENCEFILE。并使用\001作为字段分隔符,用换行符作为行分隔符*/
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;

如果在创建分区表时,出现这样的错误:FAILED: Error in semantic analysis: Column repeated in partitioning columns,这意味着分区列和普通列出现了重复。需要修改分区列列名或普通列列名。

Example:

-- 列名与分区列名相同
create table table_name (
  id                int,
  date              string,
  name              string
)
partitioned by (date string)


-- 建议修改任意一方消除重复
create table table_name (
  id                int,
  dtDontQuery       string,
  name              string
)
partitioned by (date string)

Bucketed Sorted Tables

Example:

-- page_view表按用户id分桶,并且在每个bucket中,数据是按viewTime的递增顺序排序的。
-- 这样的结构,方便用户对聚类列(userid)进行有效的抽样
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;

CLUSTERED BYSORTED BY创建命令不影响数据如何插入到表中,只影响如何读取数据。用户必须合理的插入相应的数据,使得reducers的数量等于桶的数量。并在查询中使用CLUSTER BY和SORT BY命令。

External Tables

在建表时如果使用了EXTERNAL关键字,那么该表就称之为外表,外表在创建时需要使用LOCATION来指定hdfs路径。当你删除这个外表时,hdfs中的数据并不会随之而删除。从Hive 4.0.0版本开始,提供了external.table.purge=true参数,该参数被设定为true时,当你删除外表时,其指定的hdfs路径下的文件也将被删除。

Example:

-- 你可以该语句创建一个page_view表,它可以指向任意一个HDFS的存储位置。但是仍然确保该路径下的数据时按照CREATE语句中指定的方式进行分隔。
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>';

Skewed Tables

当表中的一个或多个列具有倾斜值时,使用此特性有助于提高性能。通过指定经常出现的值(严重倾斜的值),Hive会自动将这些值拆分到单独的文件(或目录下的列表桶),并在查询时考虑这一文件,避免扫描全表。可以在表创建期间在每个表级别上分别指定。

Example:

-- 下面的示例显示了一个具有三个倾斜值的列,可选择使用指定列表桶的STORED AS DIRECTORIES子句。
CREATE TABLE list_bucket_single (key STRING, value STRING)
  SKEWED BY (key) ON (1,5,6) [STORED AS DIRECTORIES];

Example:

-- 这是一个有两个倾斜列的表的例子。
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];

Temporary Tables

版本信息

从Hive 1.1.0开始,临时表的存储策略可以通过Hive.exec.temporary.table.storage配置参数设置为memory、ssd或default(参见HDFS Storage Types and Storage Policies)。

Temporary Table创建的临时表仅对当前会话可见。数据存储在用户的临时目录中,并在会话结束时删除。

如果创建临时表时使用的数据库/表名是数据库中已经存在的永久表,那么在会话中对该表的任何引用都将解析为临时表,而不是永久表。如果不删除临时表或将其重命名为不冲突的名称,用户将无法在该会话中访问到原始表。

Temporary tables有以下一些限制:

  • 不支持分区列。
  • 不支持创建索引。

Example:

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

Transactional Tables

版本信息

从Hive 4.0开始支持 (HIVE-18453).

支持ACID语义操作的表。

Example:

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

Create Table As Select (CTAS)

能够从一个表选择数据到另一个表是Hive最强大的特性之一。Hive在执行查询时处理数据从源格式到目标格式的转换。create-table-as-select (CTAS)语句是通过查询的结果创建表结果,并将查询的结果数据插入至创建的表中。由CTAS创建的表在查询执行完成之前,用户不会看到该表。

CTAS有以下一些限制:

  • 目标表不能是外表(External Tables)
  • 目标表不能是分桶表( Bucketed Sorted Tables)

Example:

-- 用CTAS语句,从SELECT语句的结果(new_key DOUBLE, key_value_pair STRING)创建了目标表new_key_value_store。并在SELECT语句中使用特定的SerDe和独立于源表的存储格式创建新的目标表
-- 注:如果SELECT语句没有指定列别名,列名将自动分配给_col0、_col1和_col2等。
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;

Create Table Like

CREATE TABLE LIKE table_name,可以复制现有表定义(不复制其数据)。

Example:

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

在Hive 0.8.0之前,CREATE TABLE LIKE view_name只是创建一个视图的副本。

在Hive 0.8.0及以后的版本中,CREATE TABLE LIKE view_name,可以通过view_name(字段和分区列)的模式创建一个表,使用默认的SerDe和文件格式。

Constraints

版本信息

从Hive 2.1.0版本开始支持 (HIVE-13290).

Hive支持主键和外键的设定。当存在约束时,一些SQL工具会生成更有效的查询。由于这些约束没有经过验证,所以上游系统需要在将数据加载到Hive之前确保数据的完整性。

Example:

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);

版本信息

从Hive 3.0.0版本开始支持 (HIVE-16575, HIVE-18726, HIVE-18953).

Hive支持在建表时使用UNIQUE, NOT NULL, DEFAULT和CHECK。除了UNIQUE之外,其他三种类型的约束都是强制的。

Example:

create table constraints1 (
    id1 integer UNIQUE disable novalidate, 
    id2 integer NOT NULL,
    usr string DEFAULT current_user(), 
    price double CHECK (price > 0 AND price <= 1000)
);
 
create table constraints2 (
    id1 integer, 
    id2 integer,
    constraint c1_unique UNIQUE(id1) disable novalidate
);
 
create table constraints3 (
    id1 integer, 
    id2 integer,
    constraint c1_check CHECK(id1 + id2 > 0)
);

默认情况下,不支持复杂数据类型(如map、struct、array)。

Drop Table

DROP TABLE [IF EXISTS] table_name [PURGE];     -- (Note: PURGE available in Hive 0.14.0 and later)

DROP TABLE操作会删除表的元数据和数据。如果配置了Trash(并且没有指定PURGE),删除表后数据会移动到.Trash/Current目录(一般情况下,数据会被移到用户主目录的.Trash下面)。否则,表信息将从metastore中删除,原始数据将被删除,就像使用hadoop dfs -rm一样。

技巧提示

如果误删了表,可以通过重新创建一个相同模式的表,并重新创建分区,然后使用Hadoop命令手动将数据移回原位来恢复丢失的位置(这个解决方案可能会随着时间的推移变得无效,.Trash下的文件也是有保留时长,超时后会被彻底删除。所以强烈建议用户不要瞎吉尔删表。)

删除视图引用的表时,不会给出告警提示(在这之后对应的视图就无效了,必须由用户删除或重新创建)。

删除EXTERNAL表时,表中的数据不会删除。(从Hive 4.0.0版本开始,提供了external.table.purge=true参数,该参数被设定为true时,当你删除外表时,其指定的hdfs路径下的文件也将被删除。)

在Hive 0.7.0或更高版本中,如果删表时表已经不存在,DROP会返回一个错误提示,可以通过IF EXISTS子句或配置变量Hive .exec. DROP.ignorenonexistent被设置为true来跳过这个错误提示。

如果指定了PURGE,则表删除后,数据不会到. trash /Current目录,因此在错误的DROP事件中无法检索。清除选项也可以用表属性auto指定。清除(参见上面的TBLPROPERTIES)。

版本信息: PURGE

从 Hive 0.14.0 开始支持(HIVE-7100)PURGE 选项

Truncate Table

版本信息

从 Hive 0.11.0 版本开始支持 (HIVE-446).

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

Truncate Table会删除表或分区中的所有数据内容,但不会清除表的元数据。如果文件系统垃圾回收模式是启用状态,这些行将被移入垃圾桶中(即.Trash目录),否则对应数据将被彻底删除(从Hive 2.2.0和Hive -14626开始)。用户可以使用partition_spec指定删除部分分区,若未指定则是删除整表。

从HIVE 2.3.0 (HIVE-15880)开始,如果表属性auto.purge(参见上面的TBLPROPERTIES)被设置为true,则当对表发出TRUNCATE table命令时,表的数据不会移动到Trash。这个属性只对内表有效。

从Hive 4.0 (Hive -23183)开始,TABLE这个关键字变的可选,但以前的版本执行TRUNCATE仍需要带上它。

Alter Table/Partition/Column

Alter table语句使用户能够更改现有表的结构。可以添加列/分区,更改SerDe,添加表和SerDe属性,或者重命名表本身等。类似地,Alter table partition 语句允许更改指定表特定分区的属性。

Alter Table

Rename Table

ALTER TABLE table_name RENAME TO new_table_name;

这个语句用于给表进行重命名。

在Hive0.6之前,该语句只是在metastore中重命名表,不移动HDFS位置。

从Hive0.6开始,该语句会对内表执行重命名,并会改变其数据文件的HDFS位置。

从Hive2.2.0版本(HIVE-14909)开始,执行该语句的规则发生了变化,只有在创建表时不带LOCATION子句并且在其数据库目录下时,才会修改HDFS位置。

Alter Table Properties

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来获取所有表当前所有的属性信息。

Alter Table Comment

此语句通过修改表的属性来修改其注释。

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

Add SerDe Properties

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对象添加用户定义的元数据。(注意,property_nameproperty_value都必须加引号。)

当Hive以序列化和反序列化初始化表时,SerDe属性会被传递。因此用户可以在这里存储自定义SerDe所需的信息。

Example:

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

更多信息请参考 SerDe documentationHive SerDe

Remove SerDe Properties

版本信息

从 Hive 4.0.0 版本开始支持 (HIVE-21952).

ALTER TABLE table_name [PARTITION partition_spec] UNSET SERDEPROPERTIES (property_name, ... );

这些语句用于将用户定义的元数据删除。(注意,property_name必须加引号。)

Example:

ALTER TABLE table_name UNSET SERDEPROPERTIES ('field.delim');

Alter Table Storage Properties

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

这些语句用于修改表的物理存储属性。

注意:这些命令只会修改Hive的元数据,不会重组或重新格式化现有的数据。用户应该确保实际的数据布局符合元数据定义。

Alter Table Skewed or Stored as Directories

版本信息

从 Hive 0.10.0 版本开始支持 (HIVE-3072 and HIVE-3649).

可以使用ALTER table语句更改表的倾斜和存储AS目录选项。有关相应的CREATE TABLE语法,请参阅上方章节。

Alter Table Skewed
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选项决定倾斜表是否使用列表bucket特性,该特性为倾斜值创建子目录。

Alter Table Not Skewed
ALTER TABLE table_name NOT SKEWED;

NOT incline选项可以使表不启用倾斜选项,并关闭列表桶功能(因为列表桶表总是倾斜的)。这会影响ALTER语句之后创建的分区,但对ALTER语句之前创建的分区没有影响。

Alter Table Not Stored as Directories
ALTER TABLE table_name NOT STORED AS DIRECTORIES;

这将关闭列表桶功能,尽管表仍然倾斜。

Alter Table Set Skewed Location
ALTER TABLE table_name SET SKEWED LOCATION (col_name1="location1" [, col_name2="location2", ...] );

这将更改列表桶的位置映射。

Alter Table Constraints

版本信息

从 Hive 2.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 ADD CONSTRAINT constraint_name UNIQUE (column, ...) DISABLE NOVALIDATE;

ALTER TABLE table_name CHANGE COLUMN column_name column_name data_type CONSTRAINT constraint_name NOT NULL ENABLE;
ALTER TABLE table_name CHANGE COLUMN column_name column_name data_type CONSTRAINT constraint_name DEFAULT default_value ENABLE;
ALTER TABLE table_name CHANGE COLUMN column_name column_name data_type CONSTRAINT constraint_name CHECK check_expression ENABLE;
 
ALTER TABLE table_name DROP CONSTRAINT constraint_name;

Additional Alter Table Statements

有关更多更改表的DDL语句,请参见下面的Alter Either Table or Partition。

Alter Partition

通过使用ALTER TABLE语句中的PARTITION子句,可以添加、重命名、交换(移动)、删除或(是否)归档分区。

版本信息

从 Hive 1.2 版本开始 (HIVE-10307), 如果属性hive.typecheck.on.insert被设置为true(默认值),分区规范中指定的分区值将被类型检查、转换和规范化以符合其列类型。值可以是数字字面值。

Add Partitions

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改变了表元数据,但不加载数据。如果数据在分区的位置不存在,查询将不会返回任何结果。)如果该表的分区已经存在,则抛出一个错误。可以使用IF NOT EXISTS来跳过这个错误提醒。

版本信息

在Hive0.7版本中,一个ALTER TABLE中包含多个partition_spec这种写法会报错。

在Hive 0.8版本及以后版本中,可以在一条ALTER TABLE语句中添加多个分区,如下例所示。

Example:

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

在Hive 0.7中,如果想添加很多分区,应该使用下面的形式:

Example:

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';
Dynamic Partitions

在执行Hive INSERT语句(或Pig STORE语句)时,动态添加分区。有关细节和示例,请参阅这些文档:

Rename Partition

版本信息

从 Hive 0.9. 版本开始支持

ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;

这个语句会更改分区列的值。通常情况下的用例是,可以使用此语句来规范化遗留分区的列值,使其符合规范类型。在这种情况下,旧partition_spec中的列值没有启用类型转换和归一化,即使属性hive.typecheck.on.insert设置为true(默认),仍旧可以在旧partition_spec中以字符串形式查看指定遗留数据。

Exchange Partition

在表之间交换(移动)分区。

版本信息

从 Hive 0.12 版本开始支持(HIVE-4095). 支持多分区的版本:Hive 1.2.2, 1.3.0, and 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;

该语句允许将分区中的数据从一个表移动到另一个具有相同模式且尚未拥有该分区的表。

Discover Partitions

版本信息

从 Hive 4.0.0 版本开始支持 (HIVE-20707).

discover.partitions是一个表属性 ,该属性用于令Hive Metastore启动分区元数据的自动发现和同步。

当 Hive Metastore Service (HMS) 在远程服务模式下启动时,后台线程(PartitionManagementTask)每300秒定时调度一次(可通过Metastore .partition.management.task.frequency config配置),它查找带有discover. partition.management.task.frequency config的表。partitions表属性设置为true并在同步模式下执行MSCK REPAIR。如果表是事务性表,则在执行MSCK REPAIR之前为该表获得Exclusive Lock。有了这个表属性,MSCK REPAIR table table_name SYNC PARTITIONS不再需要手动运行。

Partition Retention

版本信息

As of Hive 4.0.0 (HIVE-20707).

表属性partition.retention,可以为分区表指定保留周期。当指定保留间隔时,运行在HMS中的后台线程(请参阅“发现分区”部分)将检查分区的年龄(创建时间),如果分区的年龄大于保留时间,则将删除分区,同时也会删除该分区中的数据。

例如,如果一张以date为分区列的表,在创建时启用了"discover.partitions"="true"并设置了"partition.retention.period"="7d"。则仅保留最近7天内创建的分区,7前天的数据将被定时清理。

Recover Partitions (MSCK REPAIR TABLE)

Hive在其元数据库中为每个表存储一个分区列表。然而,如果新分区被直接添加到HDFS(例如使用hadoop fs -put命令)或从HDFS删除,除非用户在每个新添加或删除的分区上分别运行ALTER TABLE table_name ADD/DROP partition命令,否则metastore(因此Hive)不会意识到这些对分区信息的更改。

但是,用户可以使用repair table选项运行metastore check命令:

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

它会将元数据不存在的分区更新到Hive的元数据库。MSC命令的默认选项是ADD PARTITIONS

  • ADD PARTITIONS选项,将HDFS上存在但不在元数据库中的分区添加到元数据库中。
  • DROP PARTITIONS选项,将从元数据库中删除分区信息,这已经从HDFS中删除了。
  • SYNC PARTITIONS选项,等同于同时调用ADD PARTITIONS和DROP PARTITIONS。
  • See HIVE-874 and HIVE-17824 for more details.
  • 当Hive中存在大量未跟踪的分区时,可以通过批处理运行MSCK REPAIR TABLE来避免OOME(Out of Memory Error)。配置hive.msck.repair.batch.size的大小,该属性的默认值为0,这意味着它将一次执行所有分区。
  • MSCK命令如果不添加 REPAIR选项,可用于修复与元数据库中不匹配的元数据。

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

ALTER TABLE table_name RECOVER PARTITIONS;

从Hive 1.3开始,如果在HDFS上发现分区值中包含不允许字符的目录,MSCK将抛出异常。可以通过hive.msck.path.validation属性设置来改变这种行为:

  • skip:将跳过目录
  • ignore:将尝试创建分区(旧行为),这可能有用,也可能没用。

Drop Partitions

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,数据会移动到.Trash/Current目录,除非指定了PURGE,但是无论如何,元数据都会完全丢失(参见上面的Drop Table)。

版本信息: PROTECTION

IGNORE PROTECTION is no longer available in versions 2.0.0 and later. This functionality is replaced by using one of the several security options available with Hive (see SQL Standard Based Hive Authorization). See HIVE-11145 for details.

对于NO_DROP CASCADE保护的表,可以使用IGNORE PROTECTION删除指定的分区或一组分区(例如,在两个Hadoop集群之间分割一个表时):

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

不管保护状态如何,上面的命令都将删除该分区。

版本信息: PURGE

The PURGE option is added to ALTER TABLE in version 1.2.1 by HIVE-10934.

如果指定了PURGE,分区数据不会到.Trash/Current目录,因此在DROP的事件日志中无法检索到错误信息:

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

清除选项也可以用表属性auto.purge。(参见上面的TBLPROPERTIES)。

在Hive 0.7.0或更高版本中,如果删除的分区不存在,DROP时将返回一个错误,除非指定了if EXISTS或配置变量 hive.exec.drop.ignorenonexistent被设置为true。

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

(Un)Archive Partition

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

归档是一种将分区文件移动到Hadoop Archive (HAR)的功能。注意,只有文件计数会减少;HAR不提供任何压缩。参阅LanguageManual Archiving获取更多详情。

Alter Either Table or Partition

Alter Table/Partition File Format

ALTER TABLE table_name [PARTITION partition_spec] SET FILEFORMAT file_format;

此语句更改表(或分区)的文件格式。有关可用的file_format选项,请参阅上面CREATE TABLE的部分。该操作仅更改表元数据。现有数据的任何转换都必须在Hive外部完成。

Alter Table/Partition Location

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

Alter Table/Partition Touch

ALTER TABLE table_name TOUCH [PARTITION partition_spec];

TOUCH读取元数据,并重写(修改表的LastModifiedTime,并将表的LastModifiedTime修改为当前时间)。举个例子,假如你有一个hooks (它将记录所有被修改的表/分区),以及一个外部脚本(可以直接改变HDFS上的文件)。由于脚本在hive外部修改文件,因此hooks 不会记录修改。外部脚本可以调用TOUCH来触发hooks ,并将所述表或分区标记为已修改。

注意,TOUCH命令不会创建表或分区如果它们不存在的话。

Alter Table/Partition Protections

版本信息

As of Hive 0.7.0 (HIVE-1413). The CASCADE clause for NO_DROP was added in HIVE 0.8.0 (HIVE-2605).

This functionality was removed in Hive 2.0.0. This functionality is replaced by using one of the several security options available with Hive (see SQL Standard Based Hive Authorization). See HIVE-11145 for details.

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,级联分区也不能被删除,除非drop partition命令指定了IGNORE PROTECTION。

Alter Table/Partition Compact

版本信息

In Hive release 0.13.0 and later when transactions are being used, the ALTER TABLE statement can request compaction of a table or partition. As of Hive release 1.3.0 and 2.1.0 when transactions are being used, the ALTER TABLE ... COMPACT statement can include a TBLPROPERTIES clause that is either to change compaction MapReduce job properties or to overwrite any other Hive table properties. More details can be found here.

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

一般来说,当使用Hive transactions时,不需要手动合并文件,因为系统将自动检测并自动合并。但是,如果关闭了表的自动合并,或者您希望不通过系统执行自动合并,那么可以使用ALTER table来操作合并事项。默认情况下,该语句将对压缩请求进行排队并返回。要查看合并的进度,使用SHOW COMPACTIONS。从Hive 2.2.0开始,加入了AND WAIT可选项,该项用于指定在合并执行完成之前的一些操作。

合并类型可以时 MAJOR 或是 MINOR。 参阅 Hive Transactions 获取更多详情。

Alter Table/Partition Concatenate

版本信息

In Hive release 0.8.0 RCFile added support for fast block level merging of small RCFiles using concatenate command. In Hive release 0.14.0 ORC files added support fast stripe level merging of small ORC files using concatenate command.

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

如果表或分区包含许多小的rcfile或ORC文件,那么上面的命令将把它们合并成更大的文件。对于RCFile,合并发生在块级别,而对于ORC文件,合并发生在条带级别,从而避免了解压和解码数据的开销。

Alter Table/Partition Update columns

版本信息

In Hive release 3.0.0 this command was added to let the user sync serde stored schema information to metastore.

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

具有serdes的表(serdes自描述表模式)在使用中可能与存储在Hive Metastore中的表具有不同的模式。例如,当用户使用模式url或模式文字创建一个Avro存储表时,该模式将被插入到HMS中,然后无论serde中的url或文字是否更改,该模式都不会在HMS中更改。这可能会导致问题,特别是在与其他Apache组件集成时。

更新列特性为用户提供了一种方法,可以让serde中所做的更改同步到HMS中。它同时适用于表和分区级别,但只适用于HMS没有跟踪模式的表(参见metastore.serdes.using.metastore.for.schema)。对后一种serde类型使用该命令将导致错误。

Alter Column

Rules for Column Names

列名不区分大小写。

**版本信息**

在Hive 0.12及更早的版本中,表名和列名中只允许使用字母数字和下划线字符。

在Hive 0.13及以后的版本中,列名可以包含任何Unicode字符(参见Hive -6013),但是,点(.)和冒号(:)在查询时会产生错误,因此在Hive 1.2.0中不允许使用它们(参见Hive -10120)。如果在表名或列名中使用到了特殊字符或保留关键字,可以使用反撇号包裹,使其可以被强制定义。

如果想要恢复到Hive 0.13之前,即将列名限制为只允许字母数字和下划线字符,请将配置属性hive.support.quotes.identifiers=none。启用该配置后,反撇号包含的内容将被解释为正则表达式。有关更多详细信息,请参见Supporting Quoted Identifiers in Column Names

Change Column Name/Type/Position/Comment

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子句在Hive 0.14.0及更高版本中可用。使用方法请参见 Upgrading Pre-Hive 0.13.0 Decimal Columns 。Hive 0.13的补丁也可用(参见HIVE-7971)。

Hive 1.1.0中添加了CASCADE|RESTRICT子句。ALTER TABLE CHANGE COLUMN with CASCADE命令更改列同时更新表的元数据,并将相同的更改级联到所有分区元数据。RESTRICT是ALTER Column的默认值,仅更新列的元数据。

TIP

无论表或分区的保护模式如何,ALTER TABLE CHANGE COLUMN CASCADE子句都将覆盖表分区的列元数据。谨慎使用。

TIP

列更改命令只会修改Hive的元数据,而不会修改数据。用户应该确保表/分区的实际数据布局符合元数据定义。

Example:

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

Add/Replace Columns

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,会将新列添加到现有列的末尾,但在分区列之前。ADD COLUMNS这也Avro类型的表,这需要Hive 0.14和更高版本。

REPLACE COLUMNS,该选项会删除所有现有列并添加新列集。这只能用于具有本地SerDe的表(DynamicSerDe, MetadataTypedColumnsetSerDe, LazySimpleSerDe和ColumnarSerDe)。更多信息请参考Hive SerDe。REPLACE COLUMNS也可以用来删除列。例如,ALTER TABLE test_change REPLACE COLUMNS (a int, b int);将从test_change表中删除列'c'。

PARTITION子句在Hive 0.14.0及更高版本中可用。使用方法请参见 Upgrading Pre-Hive 0.13.0 Decimal Columns

Hive 1.1.0中添加了CASCADE|RESTRICT子句。ALTER TABLE ADD|REPLACE COLUMNS with CASCADE命令更改列同时更新表的元数据,并将相同的更改级联到所有分区元数据。RESTRICT是ALTER Column的默认值,仅更新列的元数据。

TIP

无论表或分区的保护模式如何,ALTER TABLE ADD or REPLACE COLUMNS CASCAD子句都将覆盖表分区的列元数据。谨慎使用。

TIP

列更改命令只会修改Hive的元数据,而不会修改数据。用户应该确保表/分区的实际数据布局符合元数据定义。

Partial Partition Specification

从Hive 0.14 (Hive -8411)开始,alter语句类似于动态分区的操作。因此,不必为每个需要更改的分区发出alter column语句:

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 partition期间使用部分分区规范。支持如下操作:

  • Change column
  • Add column
  • Replace column
  • File Format
  • Serde Properties

Create/Drop/Alter View

版本信息

View support is only available in Hive 0.6 and later.

Create View

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可能会将视图的定义与查询的定义结合起来,例如,从查询向下推过滤器到视图中。)

视图的模式在创建视图时就已经被锁定;对底层表的后续更改(例如添加一个列)将不会反映在视图的模式中。如果以不兼容的方式删除或更改底层表,后续查询无效视图的尝试将失败。

视图是只读的,不能用作LOAD/INSERT/ALTER的目标。要更改视图的元数据,请参见ALTER VIEW

视图可以包含ORDER BY和LIMIT子句。但是创建的使用这些优先级将高于后续查询时的语法。例如,如果一个视图在创建时指定了LIMIT 5,在查询阶段执行(select * from v LIMIT 10),那么也最多返回5行。

Hive 0.13.0开始,视图的select语句可以包括一个或多个通用表表达式(CTEs),如select语法所示。有关CREATE VIEW语句中的cte示例,请参见通用表表达式

Example:

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语句。

使用SHOW VIEWS,显示数据库中的视图列表(从Hive 2.2.0开始)。

版本信息

Originally, the file format for views was hard coded as SequenceFile. Hive 2.1.0 (HIVE-13736) made views follow the same defaults as tables and indexes using the hive.default.fileformat and hive.default.fileformat.managed properties.

Drop View

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

DROP VIEW删除指定视图的元数据。(在视图上使用DROP TABLE是不可行的,会抛出异常。)

当删除由其他视图引用的视图时,不会给出警告。(依赖的视图悬空为无效,必须由用户删除或重新创建)。

在Hive 0.7.0或更高版本中,如果视图不存在,DROP将返回一个错误,除非指定if EXISTS或配置变量hive.exec.drop.ignorenonexistent为true。

Example:

DROP VIEW onion_referrers;

Alter View Properties

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

与ALTER TABLE一样,可以使用此语句向视图添加或修改元数据。

Alter View As Select

版本信息

As of Hive 0.11.

ALTER VIEW [db_name.]view_name AS select_statement;

Alter View As Select changes the definition of a view, which must exist. The syntax is similar to that for CREATE VIEW and the effect is the same as for CREATE OR REPLACE VIEW.

Alter View As Select用于更改已存在的视图的定义。语法与CREATE VIEW类似,效果与CREATE OR REPLACE VIEW相同。

注意:视图必须已经存在,如果视图有分区,它不能被Alter view As Select替换。

Create/Drop/Alter Materialized View

版本信息

Materialized view support is only available in Hive 3.0 and later.

本节介绍Hive物化视图语法。关于Hive中物化视图支持和使用的更多信息可以在这里here.找到。

在Hive 0.12.0和更早的版本中,CREATE index和DROP index语句的索引名是区分大小写的。然而,ALTER INDEX需要一个用小写字母创建的索引名(参见HIVE-2752)。此错误在Hive 0.13.0中修复,使所有HiveQL语句的索引名不区分大小写。对于0.13.0之前的版本,最佳实践是对所有索引名使用小写字母。

Create Index

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使用给定的列列表作为键在表上创建索引。参见Indexes设计文档中的CREATE INDEX。

Drop Index

DROP INDEX [IF EXISTS] index_name ON table_name;

DROP INDEX删除索引,同时删除索引表。

在Hive 0.7.0或更高版本中,如果索引不存在,DROP将抛出异常,除非指定if EXISTS或配置变量Hive .exec. DROP .ignorenonexistent设置为true。

Alter Index

ALTER INDEX index_name ON table_name [PARTITION partition_spec] REBUILD;

ALTER INDEX ... REBUILD builds an index that was created using the WITH DEFERRED REBUILD clause, or rebuilds a previously built index. If PARTITION is specified, only that partition is rebuilt.

ALTER INDEX ... REBUILD构建使用WITH DEFERRED REBUILD子句创建的索引,或者重建先前构建的索引。如果指定了PARTITION,则只重建该分区。

Create/Drop Macro

版本信息

As of Hive 0.12.0.

Bug fixes:

  • Prior to Hive 1.3.0 and 2.0.0 when a HiveQL macro was used more than once while processing the same row, Hive returned the same result for all invocations even though the arguments were different. (See HIVE-11432.)
  • Prior to Hive 1.3.0 and 2.0.0 when multiple macros were used while processing the same row, an ORDER BY clause could give wrong results. (See HIVE-12277.)
  • Prior to Hive 2.1.0 when multiple macros were used while processing the same row, results of the later macros were overwritten by that of the first. (See HIVE-13372.)

Hive 0.12.0向HiveQL引入了宏的概念,在此之前,宏只能在Java中创建。

Create Temporary Macro

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

CREATE TEMPORARY MACRO creates a macro using the given optional list of columns as inputs to the expression. Macros exist for the duration of the current session.

CREATE TEMPORARY MACRO使用给定的可选列列表作为表达式的输入创建一个宏。宏仅在当前会话期间存在。

Examples:

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;

Drop Temporary Macro

DROP TEMPORARY MACRO [IF EXISTS] macro_name;

如果函数不存在,DROP TEMPORARY MACRO将返回一个错误,除非指定了if EXISTS。

Create/Drop/Reload Function

Temporary Functions

Create Temporary Function

CREATE TEMPORARY FUNCTION function_name AS class_name;

该语句允许您创建一个由class_name实现的临时函数。只要会话持续,就可以在Hive查询中使用此功能。您可以使用Hive的类路径中的任何类。可以通过执行'add JAR'语句将JAR添加到类路径。请参考CLI部分Hive Interactive Shell Commands,,包括Hive Resources,了解更多信息。也可以参见Hive Plugins了解关于创建自定义udf的一般信息。

Drop Temporary Function

可以按以下方法删除注销UDF:

DROP TEMPORARY FUNCTION [IF EXISTS] function_name;

在Hive 0.7.0或更高版本中,如果函数不存在,DROP将返回一个错误,除非指定if EXISTS或配置变量hive.exec.drop.ignorenonexistent 被设置为true。

Permanent Functions

在Hive 0.13或更高版本中,函数可以注册到metastore,这样查询中就可以引用它们,而不必在每个会话中创建一个临时函数。

Create Function

版本信息

As of Hive 0.13.0 (HIVE-6047).

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不在本地模式,则资源位置必须是非本地路径,例如HDFS位置。

函数将被添加到指定的数据库中,或者添加到创建函数时的当前数据库中。函数可以通过限定函数名(db_name.function_name)来引用,如果函数在当前数据库中,也可以不加限定直接引用。

Drop Function

版本信息

As of Hive 0.13.0 (HIVE-6047).

DROP FUNCTION [IF EXISTS] function_name;

如果函数不存在,DROP返回一个错误,除非指定了if EXISTS或者配置变量hive.exec.drop.ignorenonexistent被设置为true。

Reload Function

版本信息

As of Hive 1.2.0 (HIVE-2573).

RELOAD (FUNCTIONS|FUNCTION);

Hive -2573之前,在某一个Hive CLI的会话中创建永久函数可能不会反映在HiveServer2或其他Hive CLI会话中(如果它们在函数创建之前启动)。在HiveServer2或HiveCLI会话中发出RELOAD函数将重新扫描对函数的更改(这些更改可能是由不同的HiveCLI会话完成的)。

Create/Drop/Grant/Revoke Roles and Privileges

Hive deprecated authorization mode / Legacy Mode has information about these DDL statements:

For SQL standard based authorization in Hive 0.13.0 and later releases, see these DDL statements:

Show

SHOW语句用于查询Hive metastore,以获取Hive的现有数据和元数据。

Show Databases

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

使用SHOW DATABASESSHOW SCHEMAS可以列出在metastore中定义的所有数据库。schema和databases的使用是可以互换的——它们的意思是一样的。

可选使用LIKE子句,可以用正则表达式筛选满足条件的数据库列表。正则表达式中的通配符只能为星号(*)或是竖线(|)。例如'employees', 'emp*', 'emp*|*ees',这些都将匹配名为'employees'的数据库。

版本信息: SHOW DATABASES

从hive 4.0.0开始只接收sql类型的通配符,'%' 用于表示任意字符, '_'用于表示单一字符. 例如:'employees', 'emp%', 'emplo_ees', 这些都将匹配名为'employees'的数据库。

Show Connectors

SHOW CONNECTORS;

从Hive 4.0.0 via HIVE-24396版本可用。

SHOW CONNECTORS列出在metastore中定义的所有连接器(取决于用户的访问权限)。

Show Tables/Views/Materialized Views/Partitions/Indexes

Show Tables

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

SHOW TABLES列出当前数据库(或使用' in '子句选中的数据库)中名称与可选正则表达式匹配的所有表和视图。正则表达式中的通配符只能为“*”,只能为“|”。例如'page_view','page_v*','*view|page*',所有这些都将匹配'page_view'表。匹配的表将按字母顺序列出。如果在metastore中没有找到匹配的表,也不会报错。

Show Views

版本信息

Introduced in Hive 2.2.0 via 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中没有找到匹配的视图,也不会报错。

Examples

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_"

Show Materialized Views

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

SHOW MATERIALIZED VIEWS 列出当前数据库中所有名称与可选正则表达式匹配的视图(或使用' in '或' FROM '子句显式命名的视图)。它还显示了关于物化视图的附加信息,例如,是否启用了重写,以及物化视图的刷新模式。正则表达式中的通配符只能为“*”,只能为“|”。如果没有给出正则表达式,则列出所选数据库中的所有物化视图。

Show Partitions

SHOW PARTITIONS table_name;

SHOW PARTITIONS列出给定表的所有现有分区。分区按字母顺序列出。

版本信息

As of Hive 0.6, SHOW PARTITIONS can filter the list of partitions as shown below.

It is also possible to specify parts of a partition specification to filter the resulting list.

Examples:

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)

版本信息

Starting with Hive 0.13.0, SHOW PARTITIONS can specify a database (HIVE-5912).

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

Example:

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

版本信息

Starting with Hive 4.0.0, SHOW PARTITIONS can optionally use the WHERE/ORDER BY/LIMIT clause to filter/order/limit the resulting list (HIVE-22458). These clauses work in a similar way as they do in a SELECT statement.

SHOW PARTITIONS [db_name.]table_name [PARTITION(partition_spec)] [WHERE where_condition] [ORDER BY col_list] [LIMIT rows];   -- (Note: Hive 4.0.0 and later)

Example:

SHOW PARTITIONS databaseFoo.tableBar LIMIT 10;                                                               -- (Note: Hive 4.0.0 and later)
SHOW PARTITIONS databaseFoo.tableBar PARTITION(ds='2010-03-03') LIMIT 10;                                    -- (Note: Hive 4.0.0 and later)
SHOW PARTITIONS databaseFoo.tableBar PARTITION(ds='2010-03-03') ORDER BY hr DESC LIMIT 10;                   -- (Note: Hive 4.0.0 and later)
SHOW PARTITIONS databaseFoo.tableBar PARTITION(ds='2010-03-03') WHERE hr >= 10 ORDER BY hr DESC LIMIT 10;    -- (Note: Hive 4.0.0 and later)
SHOW PARTITIONS databaseFoo.tableBar WHERE hr >= 10 AND ds='2010-03-03' ORDER BY hr DESC LIMIT 10;           -- (Note: Hive 4.0.0 and later)

注意:请使用hr >= 10而不是hr - 10 >= 0来过滤结果,因为Metastore不会将后一个谓词下推到底层存储中

Show Table/Partition Extended

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

SHOW TABLE EXTENDED将列出所有匹配给定正则表达式的表的信息。如果存在分区说明,则用户不能使用正则表达式作为表名。该命令的输出包括基本表信息和文件系统信息,如totalNumberFiles、totalFileSize、maxFileSize、minFileSize、lastAccessTime和lastUpdateTime。如果存在分区,它将输出给定分区的文件系统信息,而不是表的文件系统信息。

Example

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

Show Table Properties

版本信息

As of Hive 0.10.0.

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

第一种形式列出了相关表的所有表属性,每行一个,由制表符分隔。

第二种形式仅打印正在请求的属性的值。

有关更多信息,请参阅上面Create Table中的TBLPROPERTIES clause

Show Create Table

版本信息

As of Hive 0.10.

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

SHOW CREATE TABLE显示给定表的CREATE TABLE语句,或给定视图的CREATE VIEW语句。

Show Indexes

版本信息

As of Hive 0.7.

Indexing Is Removed since 3.0! See Indexes design document

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

SHOW INDEXES显示某个列上的所有索引,以及关于它们的信息:索引名、表名、用作键的列名、索引表名、索引类型和注释。如果使用FORMATTED关键字,则打印每列的列标题。

Show Columns

版本信息

As of Hive 0.10.

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

Added in Hive 3.0 by HIVE-18373.

SHOW COLUMNS列出表中名称与可选正则表达式匹配的所有列。正则表达式中的通配符只能为“*”,只能为“|”。例如“cola”,“col*”,“*a|col*”,这些都将匹配“cola”列。匹配的列按字母顺序列出。如果在表中没有找到匹配的列,则不是错误。如果没有给出正则表达式,则列出所选表中的所有列。

Examples

-- 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";

Show Functions

SHOW FUNCTIONS [LIKE "<pattern>"];

SHOW FUNCTIONS列出所有用户定义和内置函数,如果指定了LIKE,则通过正则表达式进行筛选。

Show Granted Roles and Privileges

Hive deprecated authorization mode / Legacy Mode has information about these SHOW statements:

In Hive 0.13.0 and later releases, SQL standard based authorization has these SHOW statements:

Show Locks

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;     -- (Note: Hive 0.13.0 and later; SCHEMA added in Hive 0.14.0)

SHOW LOCKS显示表或分区上的锁。有关锁的信息,请参见Hive Concurrency Model

SHOW LOCKS (DATABASE|SCHEMA)由Hive 0.13的数据库(参见Hive -2093)和Hive 0.14的SCHEMA(参见Hive -6601)支持。SCHEMA和DATABASE是可互换的——它们的意思是一样的。

Hive transactions正在被使用时,SHOW LOCKS返回此信息(参见Hive -6460)):

  • database name
  • table name
  • partition name (if the table is partitioned)
  • the state the lock is in, which can be:
    • "acquired" – the requestor holds the lock
    • "waiting" – the requestor is waiting for the lock
    • "aborted" – the lock has timed out but has not yet been cleaned up
  • Id of the lock blocking this one, if this lock is in "waiting" state
  • the type of lock, which can be:
    • "exclusive" – no one else can hold the lock at the same time (obtained mostly by DDL operations such as drop table)
    • "shared_read" – any number of other shared_read locks can lock the same resource at the same time (obtained by reads; confusingly, an insert operation also obtains a shared_read lock)
    • "shared_write" – any number of shared_read locks can lock the same resource at the same time, but no other shared_write locks are allowed (obtained by update and delete)
  • ID of the transaction this lock is associated with, if there is one
  • last time the holder of this lock sent a heartbeat indicating it was still alive
  • the time the lock was acquired, if it has been acquired
  • Hive user who requested the lock
  • host the user is running on
  • agent info – a string that helps identify the entity that issued the lock request. For a SQL client this is the query ID, for streaming client it may be Storm bolt ID for example.

Show Conf

版本信息

As of Hive 0.14.0.

SHOW CONF <configuration_name>;

SHOW CONF返回指定configuration property的描述。

  • default value
  • required type
  • description

注意,SHOW CONF不会显示配置属性的当前值。对于当前的属性设置,请使用CLI中的“set”命令或HiveQL脚本(参见Commands)或在Beeline中(参见Beeline HiveCommands)。

Show Transactions

版本信息

As of Hive 0.13.0 (see Hive Transactions).

SHOW TRANSACTIONS;

SHOW TRANSACTIONS供管理员在Hive TRANSACTIONS被使用时使用。它返回系统中所有当前打开和终止的事务的列表,包括以下信息:

  • transaction ID
  • transaction state
  • user who started the transaction
  • machine where the transaction was started
  • timestamp when the transaction was started (as of Hive 2.2.0)
  • timestamp for last heartbeat (as of Hive 2.2.0 )

Show Compactions

版本信息

As of Hive 0.13.0 (see Hive Transactions).

SHOW COMPACTIONS;

SHOW COMPACTIONS返回当前正在compacted或计划在Hive transactions被使用时进行压缩的所有表和分区的列表,包括以下信息:

  • "CompactionId" - unique internal id (As of Hive 3.0)
  • "Database" - Hive database name
  • "Table" - table name
  • "Partition" - partition name (if the table is partitioned)
  • "Type" - whether it is a major or minor compaction
  • "State" - the state the compaction is in, which can be:
    • "initiated" – waiting in the queue to be compacted
    • "working" – being compacted
    • "ready for cleaning" – the compaction has been done and the old files are scheduled to be cleaned
    • "failed" – the job failed. The metastore log will have more detail.
    • "succeeded" – A-ok
    • "attempted" – initiator attempted to schedule a compaction but failed. The metastore log will have more information.
  • "Worker" - thread ID of the worker thread doing the compaction (only if in working state)
  • "Start Time" - the time at which the compaction started (only if in working or ready for cleaning state)
  • "Duration(ms)" - time this compaction took (As of Hive 2.2 )
  • "HadoopJobId" - Id of the submitted Hadoop job (As of Hive 2.2)

Compactions are initiated automatically, but can also be initiated manually with an ALTER TABLE COMPACT statement.

Describe

Describe Database

版本信息

As of Hive 0.7.

DESCRIBE DATABASE [EXTENDED] db_name;
DESCRIBE SCHEMA [EXTENDED] db_name;     -- (Note: Hive 1.1.0 and later)

DESCRIBE DATABASE显示数据库的名称、它的注释(如果已经设置了注释)以及它在文件系统上的根位置。SCHEMA和DATABASE的用法是可以互换的——它们的意思是一样的。Hive 1.1.0 (Hive -8803)中增加了DESCRIBE SCHEMA。

EXTENDED 还显示 database properties.

Describe Dataconnector

DESCRIBE CONNECTOR [EXTENDED] connector_name;

Since Hive 4.0.0 via HIVE-24396

DESCRIBE CONNECTOR显示了连接器的名称、它的注释(如果已经设置了注释)、它的数据源URL和数据源类型。

EXTENDED还显示了数据连接器的属性。任何明文密码设置将以明文形式呈现。

Describe Table/View/Materialized View/Column

根据是否指定数据库,描述表/视图/物化视图/列语法有两种格式。

如果未指定数据库,则可选列信息在点号后面提供:

DESCRIBE [EXTENDED|FORMATTED] 
  table_name[.col_name ( [.field_name] | [.'$elem$'] | [.'$key$'] | [.'$value$'] )* ];
                                        -- (Note: Hive 1.x.x and 0.x.x only. See "Hive 2.0+: New Syntax" below)

如果指定了数据库,则可选列信息在空格后提供:

DESCRIBE [EXTENDED|FORMATTED] 
  [db_name.]table_name[ col_name ( [.field_name] | [.'$elem$'] | [.'$key$'] | [.'$value$'] )* ];
                                        -- (Note: Hive 1.x.x and 0.x.x only. See "Hive 2.0+: New Syntax" below)

DESCRIBE显示给定表的分区列的列表。如果指定了EXTENDED关键字,那么它将以Thrift序列化形式显示表的所有元数据。这通常只对调试有用,不适用于一般用途。如果指定了格式化关键字,则它将以表格形式显示元数据。

注意:DESCRIBE EXTENDED仅在数据加载时收集统计数据时显示行数(参见新创建的表),并且如果使用Hive CLI而不是Thrift客户端或Beeline。HIVE-6285将解决此问题。虽然ANALYZE TABLE在数据加载后收集统计信息(参见Existing Tables),但它目前没有提供关于行数的信息。

如果一个表有一个复杂的列,那么你可以通过指定table_name.complex_col_name(和field_name用于结构元素,'$elem$'用于数组元素,'$key$'用于映射键,'$value$'用于映射值)来检查这个列的属性。您可以递归地指定它来研究复杂的列类型。

对于视图,可以使用DESCRIBE EXTENDED或formatting来检索视图的定义。提供了两个相关的属性:用户指定的原始视图定义和Hive内部使用的扩展定义。

对于物化视图,DESCRIBE EXTENDED或formatting提供了关于是否启用重写以及给定的物化视图是否被认为是最新的,以便对它所使用的源表中的数据进行自动重写的附加信息。

版本信息 — partition & non-partition columns

In Hive 0.10.0 and earlier, no distinction is made between partition columns and non-partition columns while displaying columns for DESCRIBE TABLE. From Hive 0.12.0 onwards, they are displayed separately.

In Hive 0.13.0 and later, the configuration parameter hive.display.partition.cols.separately lets you use the old behavior, if desired (HIVE-6689). For an example, see the test case in the patch for HIVE-6689.

Bug fixed in Hive 0.10.0 — database qualifiers

Database qualifiers for table names were introduced in Hive 0.7.0, but they were broken for DESCRIBE until a bug fix in Hive 0.10.0 (HIVE-1977).

Bug fixed in Hive 0.13.0 — quoted identifiers

Prior to Hive 0.13.0 DESCRIBE did not accept backticks (`) surrounding table identifiers, so DESCRIBE could not be used for tables with names that matched reserved keywords (HIVE-2949 and HIVE-6187). As of 0.13.0, all identifiers specified within backticks are treated literally when the configuration parameter hive.support.quoted.identifiers has its default value of "column" (HIVE-6013). The only exception is that double backticks (``) represent a single backtick character.

Display Column Statistics

版本信息

As of Hive 0.14.0; see HIVE-7050 and HIVE-7051. (The FOR COLUMNS option of ANALYZE TABLE is available as of Hive 0.10.0.)

ANALYZE TABLE table_name COMPUTE STATISTICS FOR COLUMNS将计算指定表中所有列的列统计信息(如果表已分区,则为所有分区)。要查看收集的列统计信息,可以使用以下语句:

DESCRIBE FORMATTED [db_name.]table_name column_name;                              -- (Note: Hive 0.14.0 and later)
DESCRIBE FORMATTED [db_name.]table_name column_name PARTITION (partition_spec);   -- (Note: Hive 0.14.0 to 1.x.x)
                                                                                  -- (see "Hive 2.0+: New Syntax" below)

有关ANALYZE TABLE命令的更多信息,请参见 Statistics in Hive: Existing Tables

Describe Partition

根据是否指定数据库,有两种描述分区语法格式。

如果未指定数据库,则可选列信息在点号后面提供:

DESCRIBE [EXTENDED|FORMATTED] table_name[.column_name] PARTITION partition_spec;
                                        -- (Note: Hive 1.x.x and 0.x.x only. See "Hive 2.0+: New Syntax" below)

如果指定了数据库,则可选列信息在空格后提供:

DESCRIBE [EXTENDED|FORMATTED] [db_name.]table_name [column_name] PARTITION partition_spec;
                                        -- (Note: Hive 1.x.x and 0.x.x only. See "Hive 2.0+: New Syntax" below)

该语句列出给定分区的元数据。输出与description table_name类似。目前,在准备计划时不使用与特定分区关联的列信息。从Hive 1.2开始(Hive -10307),当 hive.typecheck.on.insert (被设置为true(默认为true)时,partition_spec中指定的分区列值将被类型验证,转换并归一化为它们的列类型

Example:

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)

Hive 2.0+: Syntax Change

Hive 2.0+: New syntax

In Hive 2.0 release onward, the describe table command has a syntax change which is backward incompatible. See HIVE-12184 for details.

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

警告:新语法可能会破坏当前脚本:

  • 不再接受DOT分离的table_name和column_name。它们必须被空格分隔开。DB和TABLENAME用点分隔。column_name仍然可以包含复杂数据类型的DOTs。

    可选的partition_spec必须出现在table_name之后,但在可选的column_name之前。在前面的语法中,column_name出现在table_name和partition_spec之间。

Examples:

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

Abort

Abort Transactions

版本信息

As of Hive 1.3.0 and 2.1.0 (see Hive Transactions).

ABORT TRANSACTIONS transactionID [ transactionID ...];

ABORT TRANSACTIONS从Hive metastore中清除指定的事务id,这样用户就不需要直接与metastore交互来删除悬空或失败的事务。在Hive 1.3.0和2.1.0 (Hive -12634)中增加了ABORT TRANSACTIONS。

Example:

ABORT TRANSACTIONS 0000007 0000008 0000010 0000015;

该命令可与SHOW TRANSACTIONS配合使用。后者可以帮助确定要清理的候选事务id。

Scheduled queries

文档可在 Scheduled Queries 页面上获得。

Datasketches integration

文档可在 Datasketches Integration 页面上获得。

HCatalog and WebHCat DDL

有关HCatalog和WebHCat中DDL的信息,请参见: