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 [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
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 来避免这个错误。
有关 table comments, table properties, 和 SerDe properties 的更多信息,请参考下面 Alter Table。
有关基本数据类型和复杂数据类型的详细信息,请参见 Type System and Hive Data Types 。
默认情况下,Hive创建管理表,其中文件、元数据和统计信息由内部Hive进程管理。有关管理表和外部表之间差异的详细信息,请参见管理表和外部表。
Hive支持内置和自定义开发的文件格式。有关压缩的表存储的详细信息,请参见 CompressedStorage。
以下是一些内置的Hive存储格式:
存储格式 | 描述 |
---|---|
STORED AS TEXTFILE | 存储为纯文本文件。TEXTFILE是默认的文件格式,可以配置参数hive.default.fileformat修改默认文件格式。 使用 DELIMITED 子句读取被分隔的文件。 使用’ESCAPED BY’子句(例如’ESCAPED BY ‘’)为分隔符字符启用转义。 如果你希望处理可以包含这些分隔符字符的数据,则需要转义。 还可以使用’NULL DEFINED AS’子句(默认为’\N’)指定自定义空格式。 |
STORED AS SEQUENCEFILE | 存储为压缩序列文件。 |
STORED AS ORC | 存储为ORC文件格式。支持ACID事务和基于成本的优化器(CBO)。存储列级元数据。 |
STORED AS PARQUET | 在Hive 0.13.0及更高版本中存储为Parquet柱状存储格式的Parquet格式; 在Hive 0.10,0.11或0.12中使用ROW FORMAT SERDE …STORED AS INPUTFORMAT … OUTPUTFORMAT语法。 |
STORED AS AVRO | 在Hive 0.14.0和更高版本中以Avro格式存储(参见Avro SerDe)。 |
STORED AS RCFILE | 存储为 Record Columnar File 格式。 |
STORED AS JSONFILE | 在Hive 4.0.0和更高版本中以Json文件格式存储。 |
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 Compression). |
你可以使用自定义SerDe或使用本地SerDe创建表。如果未指定 ROW FORMAT或指定了 ROW FORMAT DELIMITED,则使用本地SerDe。
使用SERDE子句创建具有自定义SerDe的表。有关SerDes的更多信息,请参见:
必须为使用本地SerDe的表指定列的列表。
可以指定使用自定义SerDe的表的列的列表,但Hive将查询SerDe以确定该表的实际列的列表。
有关SerDe的一般信息,请参阅Hive SerDe。有关输入和输出处理的详细信息,请参见SerDe。
改变表的SerDe或者SERDEPROPERTIES,使用下面讲解的 ALTER TABLE 语句。
行格式 | 描述 |
---|---|
RegEx ROW FORMAT SERDE ’org.apache.hadoop.hive.serde2.RegexSerDe’ WITH SERDEPROPERTIES ( “input.regex” = “ ) STORED AS TEXTFILE; |
存储为纯文本文件,由正则表达式转换。 下面的示例定义了默认Apache Weblog格式的表。 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 ROW FORMAT SERDE ’org.apache.hive.hcatalog.data.JsonSerDe’ STORED AS TEXTFILE |
存储为JSON格式的纯文本文件。 用于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在Hive -contrib项目之前就从HCatalog移到了Hive。通过Hive-4895添加到Hive发行版中。 Amazon SerDe可以在s3://elasticmapreduce/samples/hive-ads/libs/jsonserde.jar中获得,用于0.12.0之前的版本。 用于JSON文件的JsonSerDe在Hive 0.12和更高版本中可用。 从Hive 3.0.0开始,JsonSerDe作为“org.apache.hadoop.hive.serde2.JsonSerDe”添加到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(制表符分隔值) ROW FORMAT SERDE ‘org.apache.hadoop.hive.serde2.OpenCSVSerde’ STORED AS TEXTFILE |
存储为CSV/TSV格式的纯文本文件。 CSVSerde在Hive 0.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中获得的。 要将列转换为表中所需的类型,可以在表上创建一个视图,将其转换为所需的类型。 CSV SerDe基于https://github.com/ogrodnek/csv-serde,并在Hive-7777中添加到Hive分发版中。 CSVSerde是针对Hive 0.14和更高版本构建和测试的,它使用的是与Hive发行版绑定的Open-CSV 2.3。 有关SerDe的一般信息,请参阅Hive SerDe。有关输入和输出处理的详细信息,请参见SerDe。 |
可以使用 PARTITIONED BY 子句创建分区表。一个表可以有一个或多个分区列,并为分区列中的每个不同值组合创建一个单独的数据目录。此外,可以使用 CLUSTERED BY columns 方法对表或分区进行分桶,并且可以通过 SORT BY columns 在桶中对数据进行排序。这可以提高某些查询的性能。
当创建分区表是发生这个错误:“FAILED: Error in semantic analysis: Column repeated in partitioning columns,”这意味着你将分区列包含在表本身的列数据中。你创建的分区会生成一个伪列,你可以在其上进行查询。
例如,假设原始未分区表有三列:id, date, 和 name。
id int,
date date,
name varchar
现在要按日期进行分区。你的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;
上面的语句创建了page_view表,包含viewTime,userid,page_url,referrer_url,ip列(包含注释)。表也被分区,数据存储在序列文件中。文件中的数据格式默认为按ctrl-A(^A)分隔的字段和换行(\n)分隔的行。参考Hive分隔符。
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;
上面的语句创建与前一个表相同的表。
在前面的示例中,数据存储在
EXTERNAL 关键字允许你创建一个表并提供一个 LOCATION,这样Hive就不会使用这个表的默认位置。如果你已经生成了数据,这将非常方便。当删除一个外部表,表中的数据不会从文件系统中删除。
外部表数据存储在任何HDFS位置,而不是存储在配置属性hive.metastore.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 '' ;
你可以使用上面的语句来创建一个page_view表,该表指向其存储的HDFS路径。但是你仍然必须确保按照上面CREATE语句中指定的那样对数据进行分隔。
有关创建外部表的另一个示例,请参见 Loading Data。
还可以在一条create-table-as-select (CTAS)语句中使用查询的结果创建并填充表。CTAS创建表过程是原子的,这意味着在填充所有查询结果之前,其他用户不会看到该表。因此,其他用户要么看到带有完整查询结果的表,要么根本看不到该表。
CTAS语句有两部分,SELECT部分可以试试任何HiveQL支持的SELECT语句。CTAS的CREATE部分从SELECT部分获取结果模式,并使用其他表属性(如SerDe和存储格式)创建目标表。
从Hive 3.2.0开始,CTAS语句可以为目标表(Hive-20241)定义分区规范。
CTAS有以下限制:
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等。此外,新的目标表是使用特定的 SerDe 和独立于 SELECT 语句中的源表的存储格式创建的。
从Hive 0.13.0开始,如 SELECT 语法所示,SELECT 语句可以包含一个或多个公共表表达式(CTEs)。请参见Common Table Expression。
能够从一个表选择数据到另一个表是Hive最强大的特性之一。Hive在执行查询时处理从源格式到目标格式的数据转换。
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, ...)];
在Hive 0.8.0之前,CREATE TABLE LIKE view_name 会创建视图的一个副本。在Hive 0.8.0及以后的版本中,CREATE TABLE LIKE view_name 通过使用默认的SerDe和文件格式,采用view_name(字段和分区列)模式来创建一个表。
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 表对 userid 进行分桶(clustered by),并在每个桶中按照 viewTime 的增加顺序对数据进行排序。这样的结构允许用户对分桶列(在本例中是 userid)进行有效的抽样。排序属性允许内部操作器在评估查询时利用更好的数据结构,从而提高效率。如果一个列是 list 或map,则可以使用MAP KEYS 关键字和 COLLECTION ITEMS 关键字。
包含 CLUSTERED BY 和 SORTED BY 的创建命令不影响数据插入表的方式,只影响数据的读取方式。这意味着用户必须小心地正确插入数据,通过指定还原器的数量等于bucket的数量,并在查询中使用 CLUSTER BY 和 SORT BY 命令。
这里有一个例子creating and populating bucketed tables。
版本信息
从Hive 0.10.0起。
设计文档
参见 Skewed Join Optimization and List Bucketing 获取更多信息。
对于一个或多个列具有倾斜值的表,可以使用此特性来提高性能。通过指定经常出现的值(严重倾斜) Hive 自动将这些值分割成单独的文件(或 list bucketing 的目录),如果可能的话,在查询时要考虑到这一点,这样它就可以跳过或包含整个文件(或 list bucketing 的目录)。
这可以在表创建期间在每个表上指定。
下面的示例显示了一列,其中有三个倾斜的值,可以选择使用 STORED AS DIRECTORIES 指定 list bucketing。
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 Skewed or Stored as Directories。
版本信息
从 Hive 0.14.0 起。
作为临时表创建的表只对当前会话可见。数据将存储在用户的scratch目录中,并在会话结束时删除。
如果用数据库中已经存在的永久表的数据库/表名创建临时表,那么在该会话中对该表的任何引用都将解析到临时表,而不是永久表。如果不删除临时表或将其重命名为不冲突的名称,用户将无法在该会话中访问原始表。
临时表有以下限制:
从Hive 1.1.0开始,可以将临时表的存储策略设置为memory、ssd或默认的 hive.exec.temporary.table.storage 配置参数值(参见HDFS存储类型和存储策略 HDFS Storage Types and Storage Policies)。
CREATE TEMPORARY TABLE list_bucket_multiple (col1 STRING, col2 int, col3 STRING);
版本信息
从 Hive 4.0 (HIVE-18453)起。
支持带有ACID语义的操作的表。有关事务性表的详细信息,请参见Hive Transactions。
版本信息
从 Hive 2.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);
DROP TABLE [IF EXISTS] table_name [PURGE]; -- (Note: PURGE available in Hive 0.14.0 and later)
删除此表的元数据和数据。如果配置了Trash (没有指定 PURGE),数据实际上会移动到 .Trash/Current 目录。元数据完全丢失。
删除外部表时,表中的数据不会从文件系统中删除。
当删除视图引用的表时,不会给出警告(视图关联表被删除视为无效,必须由用户删除或重新创建)。
当删除表时,将从元数据存储中删除表信息,并像通过“hadoop dfs -rm”那样删除原始数据。在许多情况下,这会导致表数据被移动到用户主目录中的.Trash文件夹中;因此,错误删除表的用户可以通过使用相同的模式重新创建表、重新创建任何必要的分区,然后使用Hadoop手动将数据移回原位,从而恢复丢失的数据。此解决方案依赖于底层实现,因此可能随时间或跨安装发生更改;强烈建议用户不要随意删除表。
版本信息:PURGE
version 0.14.0 加入 PURGE。
如果指定了 PURGE,则表数据不会转到. trash /Current目录,因此在出现错误的删除时无法恢复。清洗选项也可以通过表属性 auto.purge 指定。清除(参见上面的TBLPROPERTIES)。
在Hive 0.7.0或更高版本中,如果表不存在,DROP返回一个错误,除非指定了 IF EXISTS,或者配置变量 hive.exec.drop.ignorenonexistent 设置为true。
有关如何删除分区,请参阅 Alter Partition 部分。
版本信息
从 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, ...)
删除表或分区中的所有行。如果启用了文件系统Trash ,这些行将被丢弃在指定目录,否则它们将被删除(从Hive 2.2.0 with Hive-14626开始)。当前目标表应该是本地/管理表,否则将引发异常。用户可以指定部分 partition_spec来一次 TRUNCATE 多个分区,省略partition_spec将 TRUNCATE 表中的所有分区。
从HIVE 2.3.0 (HIVE-15880)开始,如果表属性“auto.purge”(参见上面的TBLPROPERTIES)设置为“true”,当对表发出 TRUNCATE TABLE 命令时,表的数据不会被移动到Trash,并且数据无法恢复。这只适用于管理表。如果管理表没有设置“auto.purge”属性或者设置为“false”这个功能被关闭。