CREATE [EXTERNAL] TABLE [IF NOT EXISTS] (1) [<database_name>.]<table_name> (2) [(<column_name> <data_type> [COMMENT '<column_comment>'] (3) [, <column_name> <data_type> ...])] [COMMENT '<table_comment>'] (3) [PARTITIONED BY (<part_key> <data_type> [COMMENT '<partition_comment>'] (3) [, <part_key> <data_type >...])] (4) [CLUSTERED BY (<col_name> [, <col_name>...]) (5) [SORTED BY (<col_name> [ASC|DESC] [, <col_name> [ASC|DESC]...])] (6) INTO <num_buckets> BUCKETS] [ [ROW FORMAT <row_format>] (7) [STORED AS (TEXTFILE|ORC|CSVFILE)] (8) | STORED BY '<storage.handler.class.name>' [WITH SERDEPROPERTIES (<...>)] (9) ] [LOCATION '<hdfs_path>'] (10) [TBLPROPERTIES ('<property_name>'='<property_value>', ...)] (11)
复制
CREATE TABLE: 创建一张表
1 | EXTERNAL 为外表选项。 |
2 | 加上 <database_name>. 则将表建在指定的数据库中。 |
3 | 可以为列、表和分区用 COMMENT 加注释,注意注释要放在单引号中。 |
4 | 指定分区键,具体使用方式请参考 分区表 。 |
5 | 分桶子句,具体使用方式请参考 分桶表。 |
6 | 桶内排序选项,ASC 为升序,DESC 为降序。 |
7 | 行格式,在建TEXT表时使用,具体细节请参考TEXT表部分。 |
8 | 指定文件格式,该选项在建TEXT表,ORC表或CSV表时使用。 |
9 | 指定使用的storage handler。 |
10 | 指向HDFS上的一个目录。这个选项我们推荐只在建外表时使用,也就是和 EXTERNAL 选项合用(虽然也可以在建内表时使用,但是我们不建议这样做)。 该路径必须是绝对路径,并且执行操作的用户必须是这个路径指向的目录或文件的owner。如果 <hdfs_path> 指向的目录不存在,Slipstream会尝试新建这个目录,但是安全模式下Slipstream可能没有在指定路径新建目录的权限,所以星环科技建议尽量避免让 <hdfs_path> 指向不存在的目录。 |
11 | 表属性,由键值对表示。 |
内表与外表的区别
创建表的时候经常会碰到需要内外表的情况, 这里需要对内表和外表做一个区分. 内外表的主要区别主要体现在建表和删表的过程中, 具体如下:
分类 |
内表 |
外表 |
|
建表 |
语法 |
create table <tableName>… |
create external table <tableName>… |
具体实现 |
创建一张新表 |
对已存在的一个表建立映射表 |
|
删表 |
语法 |
drop table <tableName>; |
drop table <tableName>; |
具体实现 |
删除表, 含数据 |
删除映射关系,不删除外表 |
TEXT表
CREATE [EXTERNAL] TABLE <table_name> (<column_name> <data_type>, <column_name> <data_type>, ...) [PARTITIONED BY ...] (1) [CLUSTERED BY ...] (2) [ROW FORMAT ...] (3) [STORED AS TEXTFILE] (4) [LOCATION '<hdfs_path>'] (5) [TBLPROPERTIES ('<property_name>'='<property_value>', ...)]; (6)
复制
1 | 分区选项,TEXT表可以分区,本章不详细讨论如何分区,请参考DDL 分区表章节。 |
2 | 分桶选项,TEXT表可以分桶,本章不详细讨论如何分桶,请参考DDL 分桶表章节。 |
3 | 指定字段分隔符,如果不指定将使用Slipstream的默认分隔符。 |
4 | 指定表存储为TEXTFILE(文本文件)。因为TEXTFILE是Slipstream的默认存储格式,该选项可省略。 |
5 | 指向HDFS上的一个目录。这个选项我们推荐只在建外表时使用,也就是和 EXTERNAL 选项合用(虽然也可以在建内表时使用,但是我们 不建议 这样做)。 该路径可以是一个绝对路径,比如 /user/alice/employee 或者一个完整的URL:hdfs://nameservice1/user/alice/employee。执行该建表操作的用户必须是这个路径指向的目录或文件的owner。如果 <hdfs_path> 指向的目录不存在,Slipstream会尝试新建这个目录,但是安全模式下Slipstream可能没有在指定路径新建目录的权限,所以星环科技建议尽量避免让 <hdfs_path> 指向不存在的目录。 表属性,由键值对表示。 |
CREATE TABLE student ( id INT, name STRING);
复制
ORC表
CREATE TABLE <tableName> ( <column_name> <data_type>, <column_name> <data_type>, ... ) STORED AS ORC;
复制
CREATE TABLE student (id INT, name STRING)STORED AS ORC;
复制
Search表
Search表创建有两种方式,简写方式和复杂方式. 创建内表时简写与复杂方式都可以.创建外表时必须使用复杂方式.
-
简写方式
CREATE TABLE <tableName> ( <id> STRING, (1) <column_name> <data_type>, <column_name> <data_type>, ... ) STORED AS ES (2) [WITH SHARD NUMBER <m>] (3) [REPLICATION <n>] (4) [TBLPROPERTIES('elasticsearch.tablename'='<dbName.tableName1>')]; (5)
复制
1 | 第一列映射为Search中相映射的Index的 _id ,必须是 STRING 类型的。 |
2 | 简写方式,指定表的存储格式为 ES 。 |
3 | 可选项。指定Search中相映射的Index的分片数, 默认值为10,建议每个shard的数据量不超过25G 。建表后不可改 |
4 | 可选项。指定每个分片的副本数, 推荐使用默认值1 。建表后可改,具体语法参考修改副本数。 可选项。指定新建表在Search中相映射的Index名为<dbName.tableName1>,该Index名需不存在,默认值为 dbName.tableName 。 |
CREATE TABLE search_table( key1 STRING, content STRING, tbool BOOLEAN )STORED AS ES with shard number 10 replication 1;
复制
如此就创建了一张名为 search_table 的内表,其存储格式为 ES ,并且shard(主分片)数为10,replication(副本)数为1,即都采用默认值。
-
复杂方式
在建Search外表时必须用复杂方式. 不同于Search内表是在Search中创建一个全新的Index,Search外表是创建一个Search中已存在Index的映射,具体建表语法如下:
CREATE EXTERNAL TABLE <tableName> ( <id> STRING, <column_name> <data_type> <column_name> <data_type> ... ) STORED BY 'io.transwarp.esdrive.ElasticSearchStorageHandler' (1) [WITH SERDEPROPERTIES('elasticsearch.columns.mapping'='_id,<cl1>,<cl2>, ...')] (2) TBLPROPERTIES('elasticsearch.tablename'='<dbName.tableName1>'); (3)
复制
1 | 指定 storage handler ,为建内表中的 STORED AS ES 为该语句的简写。 |
2 | 可选项。指定外表的列和Search中的对应索引的字段的映射关系。 _id 是固定写法,其他具体映射关系将在建外表示例中介绍。 |
3 | 必选项。同建内表,但建外表时必须指定Search中一个已存在的表<dbName.tableName1>。 |
建外表时不可指定shard和副本数。 |
CREATE EXTERNAL TABLE esdrive_external_table( key1 STRING, ex0 INT, ex1 BIGINT, ex2 DOUBLE, ex3 STRING )STORED BY 'io.transwarp.esdrive.ElasticSearchStorageHandler' WITH SERDEPROPERTIES ('elasticsearch.columns.mapping'='_id,sv0,sv2,sv5,sv7') (1) TBLPROPERTIES ('elasticsearch.tablename'='default.esdrive_inner_table'); (2)
复制
1 | 指定外表对应映射的源表后,需指定新建外表的列(key1,ex0,ex1,ex2,ex3),与源表的字段(_id,sv0,sv2,sv5,sv7)之间的一一映射关系。如下表: |
2 | default.esdrive_external_table :相映射的Search中的Index名,必须已存在。 |
Search外表中的列 |
key1(string) |
ex0(int) |
ex1(bigint) |
ex2(double) |
ex3(string) |
Search源表中的字段 |
_id(string) |
sv0(integer) |
sv2(byte) |
sv5(float) |
sv7(string) |
下面,我们按照上表分析如何建立外表的列与源表的字段之间的映射关系:
-
源表的字段第一项 _id 为固定写法,映射于外表第一个 string 类型的列;
-
Search外表中的列与Search源表中的字段是一一映射的,建外表的列数不得多于源表所含的字段数目,但可以少于。
-
源表中字段的数据类型映射成新建表中列的数据类型时,需遵循隐式转换原则,如下:
Hyperdrive表
Hyperdrive表是TDH对接HBase专门设计的表.
Hyperdrive有简单和复杂两种建表语句. 创建内表时简单方法和复杂方法都可以; 建外表时必须使用复杂方法.
-
简单方式
CREATE TABLE <tableName> ( <key> <data_type>, <column_name> <data_type>, <column_name> <data_type>, ... ) STORED AS HYPERDRIVE;
复制
-
复杂方式
CREATE TABLE <tableName> ( <key> <data_type>, <column1> <data_type>, <column2> <data_type>, ... ) STORED BY 'io.transwarp.hyperdrive.HyperdriveStorageHandler' (1) WITH SERDEPROPERTIES('hbase.columns.mapping'=':key,<f:q1>,<f:q2>,...') (2) TBLPROPERTIES ("hbase.table.name" = "<hbase_table>"); (3)
复制
1 | 指定存储格式。建Hyperdrive表的 较复杂写法 。 |
2 | 用于指定新建Hyperdrive内表的每一列在底层HBase中的列名: <column_family>:<column_qualifier> |
3 | 指定表名 |
建索引
当Hyperdrive表中的数据量较大时,查询首列以外的少量数据时总是较慢。对此,Hyperdrive表支持对表中首列以外的列创建索引,用于加快查询首列以外的少量数据(不超过10000条数据)的查询速度。 索引分两种:
-
全局索引(Global Index):全局索引中的数据做为另一张相对独立的HBase表存在,它的row key即为原表的索引字段,整个过程对用户完全透明的完成。
-
全文索引(Fulltext Index):全文索引利用Elasticsearch作为索引数据的存储,用于加速对指定字段的 模糊查询
Global Index
CREATE GLOBAL INDEX <index_name> ON <tableName> ( <column_name> [SEGMENT LENGTH length1]|[(length)] (1) [,<column_name> [SEGMENT LENGTH length2]|[(length)],...] ); (2)
复制
1 | column_name :指根据哪个列建全局索引,可以有多个列,但不可包含首列(因该列映射为row key)。 |
2 | SEGMENT LENGTH length1 :只有 string 类型的列才需要指定字段长度,可简写为 (length) 。注意,简写必须有 () |
当使用 STRING 类型的列建索引时,必须指定该列在索引词条中所占字段的长度。指定的方法为
<column> SEGMENT LENGTH <length> ,或简写为 <column>(<length>) 。
复制
CREATE GLOBAL INDEX name_balance_global_index ON hd_inner_table (name(8), balance);
复制
因列name是string类型,因此需指定长度。
一个字段的 SEGMENT LENGTH 的设定最好 大于等于 字段的实际长度,这样设置可以最优化查询性能。 SEGMENT LENGTH 小于字段的实际长度可能会影响查询性能,但是不会影响查询的正确性。
例如,如果我们用身份证号id建索引,那么id的 SEGMENT LENGTH 可以设置为18。
全局索引的实现方式是在Hyperdrive中创建一张索引表用来加快查询,一般适用于一些短平快的查询。
Fulltext Index
CREATE FULLTEXT INDEX ON <tableName> ( (1) <column_name> [DOCVALUES <TRUE|FALSE>] (2) [,<column_name> [DOCVALUES <TRUE|FALSE>], ...] (3) )SHARD NUM <n>; (4)
复制
1 | 一张表只能有 一个全文索引 ,所以建全文索引无须指定索引名。 |
2 | column1 的数据类型不可以是:decimal,date,timestamp,会报错。且同样不可包含首列。 |
3 | DOCVALUES 是一个优化查询的开关,默认是打开(TRUE)的。 |
4 | SHARD NUM 指定全文索引的分片数。 |
删除索引
删除Global Index
DROP INDEX [IF EXISTS] <index_name> ON <tableName>;
复制
因一张表可以有多个全局索引,所以需指定索引名:index_name。
删除Fulltext Index
DROP FULLTEXT INDEX [IF EXISTS] ON <tableName>;
复制
因每张表只有一个全文索引,所以只需指定表名。
但是,目前HBase不支持使用SQL生成索引,您可以从HBase Shell中执行 rebuild 指令来生成索引,具体请 参考《Hyperbase 使用手册》。
分区表
CREATE [EXTERNAL] TABLE <table_name>( <column_name> <data_type>, <column_name> <data_type>, ... )PARTITIONED BY (<partition_key> <data_type>, ...) (1) [CLUSTERED BY ...] (2) [TBLPROPERTIES ('<property_name>'='<property_value>', ...)];
复制
1 | 在这里指定分区键名称和分区键的数据类型,一张表可以有多个分区键,分区键不能和表中的列重复。 |
分区表目前只支持对TEXT表、ORC表、CSV、Search表、Hyperdrive表分区。
在逻辑上,分区表和未分区表没有区别;在物理上,分区表中的数据按分区键的值放在HDFS上表目录下的对应子目录中,一个分区对应一个子目录。例如一张表user_acc_level按acc_level分区:

假设我们要查询所有acc_level=A的用户,Slipstream会只扫描acc_level=A目录下的数据,在数据量大的情况下可以显著提升查询效率。Slipstream支持多层分区——使用多个分区键分区。多层分区的表目录下会有多级分区子目录。
一张表中的数据还可以通过 分桶 放在HDFS上不同的子目录中,一张表可以同时分区和分桶。您可以参考分桶表了解更多相关信息。
-
Slipstream支持对表的单值分区:一个分区对应分区键的一个值。分区在创建表时完成,也可以通过 ALTER TABLE 来添加或者删除分区。
-
Stream暂不支持范围分区表(一个分区对应分区键值的一个范围)的写入.
本章节我们主要介绍 单值分区表 的创建、修改以及分区表数据的导入。
创建分区表
分区表的建表方式有两种:直接定义列和 CREATE TABLE LIKE。
注意 单值分区表不能用 CREATE TABLE AS SELECT 建表。
.语法:直接定义列
CREATE [EXTERNAL] TABLE <table_name>( <column_name> <data_type>, <column_name> <data_type>, ... ) PARTITIONED BY (<partition_key> <data_type>, ...) (1) [CLUSTERED BY ...] (2) [ROW FORMAT ...] (3) [STORED AS TEXTFILE|ORC|CSVFILE] (4) [TBLPROPERTIES ('<property_name>'='<property_value>', ...)];
复制
1 | 在这里指定分区键名称和分区键的数据类型,一张表可以有多个分区键,分区键不能和表中的列重复。 |
2 | 分桶子句,这里不详细描述,请参考“分桶表”章节。 |
3 | 当表为TEXT表时,指定行格式的关键字,这里不详细描述,请参考“TEXT表”章节。 |
4 | 在这指定存储格式,TEXT表、ORC表和CSV表可以分区,Holodesk表不能分区。 |
DROP TABLE IF EXISTS user_acc_level; CREATE TABLE user_acc_level (name STRING) PARTITIONED BY (acc_level STRING);
复制
分区表建成后,分区键就可以作为一个“伪”列在查询中使用。也正因为如此,同一个表的分区键和列 不能重名。
如果建分区表时Slipstream报这样的错:Error: Error while processing statement: FAILED: Error in semantic analysis: Column repeated in partitioning columns (state=,code=10),那么您在建表时,一定是发生了分区键和列重名的情况,例如:
DROP TABLE IF EXISTS demo; CREATE TABLE demo (a INT, b STRING) PARTITIONED BY (a INT);
复制
-- 建一张user_loc表,有两个分区键:acc_level和loc: DROP TABLE IF EXISTS user_loc; CREATE TABLE user_loc (name STRING) PARTITIONED BY (acc_level STRING, loc STRING);
复制
查看表的分区
SHOW PARTITIONS <partition_table_name>;
复制
添加分区
ALTER TABLE <table_name> ADD PARTITION (<partition_key>=<value>);
复制
重命名分区
ALTER TABLE <table_name> PARTITION (<partition_key>=<value>) RENAME TO PARTITION (<partition_key>=<new_value>);
复制
删除分区
ALTER TABLE <table_name> DROP PARTITION (<partition_key>=<value>);
复制
清空分区中的数据
TRUNCATE TABLE <table_name> PARTITION (<partition_key> = <value>);
复制
流数据插入分区表
请检查是否开启动态分区 hive.exec.dynamic.partition=true
INSERT INTO <parititon_table> PARTITION ( <parititon key> ) (1) SELECT id, name, type FROM <stream_name>;
复制
1 | 指定分区键 |
分桶表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [<database_name>.]<table_name>( <column1> <data_type>, <column2> <data_type>, ... )[PARTITIONED BY ...] (1) CLUSTERED BY (<col_name>) (2) [SORTED BY (<col_name> [ASC|DESC] [, <col_name> [ASC|DESC]...])] INTO <num_buckets> BUCKETS [TBLPROPERTIES ('<property_name>'='<property_value>', ...)]
复制
1 | 分区子句,具体细节请参考DDL 分区表。表可以同时分区和分桶,当表分区时,每个分区下都会有 <num_buckets> 个桶。 |
2 | <col_name> 为分桶键。分桶键只能有一个。和分区键不同的是,分桶键必须是表中已有的列,所以在指定分桶键时,不需要 指定分桶键的数据类型。 |
分桶表原理和详细用法请参考分桶表章节. 对表分桶可以将表中记录按分桶键的哈希值分散进多个文件中,这些小文件称为“桶”。
建表
分桶表的建表有三种方式:直接建表,CREATE TABLE LIKE 和 CREATE TABLE AS SELECT。Holodesk表分桶使用不同的语法,请参考<<Holodesk手册>>
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [<database_name>.]<table_name>( <column_name> <data_type>, <column_name> <data_type>, ... )[PARTITIONED BY ...] (1) CLUSTERED BY (<col_name>) (2) INTO <num_buckets> BUCKETS (3) [ROW FORMAT <row_format>] [STORED AS <file_format>] (4) [LOCATION '<hdfs_path>'] [TBLPROPERTIES ('<property_name>'='<property_value>', ...)]
复制
1 | 分区子句,具体细节请参考 分区表。表可以同时分区和分桶,当表分区时,每个分区下都会有 <num_buckets> 个桶。 |
2 | <col_name> 为分桶键。分桶键只能有一个。和分区键不同的是,分桶键必须是表中已有的列,所以在指定分桶键时,不需要 指定分桶键的数据类型。 |
3 | <num_buckets> 指定分桶个数,也就是表目录下小文件的个数。 |
4 | 指定存储格式,可以分桶的格式有 TEXTFILE,CSVFILE 和 ORC。 |
在建表时使用 CLUSTERED BY 只决定了Slipstream读取这张表的方式,但不决定Slipstream将数据写入表的方式。也就是说,建表时的 CLUSTERED BY 仅仅是利用表的元数据给Slipstream提示,让Slipstream可以根据提示的数据分布选择最优的数据读取逻辑。但是表中数据的 实际 分布是在数据写入时决定的。如果写入数据的方式不当,那么表中数据将呈现出和表的元数据不同的分布(例如没有正确分桶)。所以执行导入数据的用户需要确保数据正确地被写入表中,具体操作请参考向分桶表内导数据。 |
下面语句建一个分桶表user_cid_regdate,分桶键为cid,分成三个桶
DROP TABLE IF EXISTS user_cid_regdate; CREATE TABLE user_cid_regdate (name STRING, cid STRING, regdate DATE) CLUSTERED BY (cid) INTO 3 BUCKETS;
复制
插入数据
向分桶表内导数据的方法为使用 INSERT … SELECT 向表中插入查询结果。需要注意的是,Slipstream向分桶表内写数据时,并不会自动将数据分桶,所以,在导数据的用户要手动分桶,确保目标表中的数据和它定义的分布一致。手动分桶的方法有两种,效果相同。
-
方法一: 打开enforce bucketing开关。
-
方法二: 将reducer个数设置为目标表的桶数,并在 SELECT 语句中用 DISTRIBUTE BY <bucket_key> 对查询结果按目标表的分桶键分进reducer中。
通过Enforce Bucketing写数据
SET hive.enforce.bucketing=true; (1) INSERT (INTO|OVERWRITE) TABLE <bucketed_table> SELECT <select_statement>;
复制
1 | 打开enforce bucketing开关,强制Slipstream分桶。这个开关默认情况下是打开的,但是可能在Slipstream使用过程中被关掉,所以向分桶表导数据前,请确保开关是打开的。 |
通过设置reducer个数写数据
SET mapred.reduce.tasks = <num_buckets>; (1) INSERT (INTO|OVERWRITE) TABLE <bucketed_table> SELECT <select_statement> FROM <stream_name> DISTRIBUTE BY <bucket_key>, [<bucket_key>, ...]; (2)
复制
1 | 将reducer个数设置为目标表的桶数(<num_buckets>)。向分桶表插入数据时,SELECT 的每个reducer产生的结果会被插入一个桶中,所以执行插入的用户需要保证reducer个数和目标表中分桶数一致。 |
2 | 将查询结果按对应目标表分桶键的列分进各个reducer,做到查询结果的数据分布和表定义的分桶一致。 |
表其他操作
SHOW TABLES: 列出当前数据库里所有的表.
SHOW TABLES [IN <database_name>] [LIKE '<identifier_with_wildcards>'];
复制
如果想要查看非当前数据库中的表和流,可以使用 [IN <database_name>] 来指定数据库。使用 [LIKE '<identifier_with_wildcards>'] 选项可以用通配符进行模糊搜索,<identifier_with_wildcards> 需要放在引号中。
SHOW TBLPROPERTIES: 显示某一个表的属性
SHOW TBLPROPERTIES <table_name>; SHOW TBLPROPERTIES <table_name>("<property_name>");
复制
SHOW TBLPROPERTIES 查看指定表的TBLPROPERTIES。如果只要查看某个属性,可以在表名后面的括号中指明。
SHOW CREATE TABLE: 查看指定表或视图的建表语句。
SHOW CREATE TABLE ([<db_name>.]<table_name>);
复制
SHOW PARTITIONS: 查看指定表的分区情况。
show partitions ([<db_name>.]<table_name>);
复制
DESCRIBE TABLE: 查看表属性.
DESCRIBE|DESC [EXTENDED|FORMATTED] [<db_name>.]<table_name>;
复制
DESCRIBE EXTENDED 和 DESCRIBE FORMATTED 会输出一些额外信息。
重命名
ALTER TABLE <table_name> RENAME TO <new_table_name>;
复制
修改或添加TABLE PROPERTIES
ALTER TABLE <table_name> SET TBLPROPERTIES ('<property_name>' = '<property_value>' ... );
复制
修改或添加SERDEPROPERTIES
ALTER TABLE <table_name> SET SERDEPROPERTIES ('<property_name>' = '<property_value>' ... );
复制
修改外表目录
ALTER TABLE <table_name> SET LOCATION '<new_location>';
复制
将外表指向的HDFS目录改为 <new_location>。注意,执行该操作的用户必须是 <new_location> 的owner。
清空表或者分区中的数据: 清空但不删除表或分区的元数据,这个操作只能用于托管表,不能用于外表。
TRUNCATE TABLE table_name [PARTITION (<partition_key> = <partition_value>[, ...] ];
复制
加上 [PARTITION (<partition_key> = <partition_value>[, …] ] 选项可以只清空指定分区中的数据。
TRUNCATE TABLE user_info;
复制
TRUNCATE TABLE user_info PARTITION (acc_level='A');
复制
DROP TABLE: 删除表
DROP TABLE [IF EXISTS] <table_name>;
复制
当被删除的表是托管表时,表的元数据和表中数据都会被删除。如果被删除的表是外部表,则只有它在Slipstream的元数据会被删除。
Table Column管理
CHANGE COLUMN: 修改列名、列的数值类型、列在表中的位置和列的注解
.语法
ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [AFTER column_name] [CASCADE|RESTRICT];
复制
CASCADE表示将修改字段元信息的影响扩展至与其相关的分区;而RESTRICT表示仅影响该字段从属的表的元信息。 上面指令可以对一列的列名、列的数值类型、列在表中的位置、列的注解或者这些的任意组合做出修改。这个指令仅仅修改表的元数据。
CREATE TABLE test_change (a INT, b INT, c INT); -- 将列a重命名为列a1 ALTER TABLE test_change CHANGE a a1 INT;
复制
ADD COLUMNS:在表中加入新的列
ADD COLUMNS 可以将新的列加入表中,位置在所有列之后,分区之前
ALTER TABLE table_name ADD COLUMNS (col_name data_type [COMMENT col_comment], ...) [CASCADE|RESTRICT] -- CASCADE表示将修改字段元信息的影响扩展至与其相关的分区;而RESTRICT表示仅影响该字段从属的表的元信息。
复制
CREATE TABLE test_change (a INT, b INT, c INT); -- 在表test_change中添加一个新列d,类型为INT ALTER TABLE test_change ADD COLUMNS(d INT);
复制
REPLACE COLUMNS:将原来的表中列结构替换为新的列结构
REPLACE COLUMNS将所有已有的列删除然后加入新指定的列。
只能对使用Slipstream自带SerDe (DynamicSerDe, MetadataTypedColumnsetSerDe, LazySimpleSerDe and ColumnarSerDe) 的表使用REPLACE COLUMNS。
REPLACE COLUMNS也可以被用于删除列
ALTER TABLE table_name REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...) [CASCADE|RESTRICT]
复制
CREATE TABLE test_change (a INT, b INT, c INT); -- 将test_change中的列由(a INT, b INT, c INT)替换为(a int, b int)起到将列c删除的效果 ALTER TABLE test_change REPLACE COLUMNS (a INT, b INT);
复制
只有TEXT、CSV、基于定宽文本文件外表这三种表支持对 字段类型 的修改。 |
SHOW COLUMNS: 列出所有指定表中的列
SHOW COLUMNS FROM|IN <table_name> [FROM|IN <database_name>];
复制
FROM 和 IN 没有区别,可替换使用
DESCRIBE COLUMNS
DESCRIBE|DESC [EXTENDED|FORMATTED] [<db_name>.]<table_name>.<column_name>;
复制