联 系 我 们
售前咨询
售后咨询
微信关注:星环科技服务号
更多联系方式 >
5.2.2 Table管理
更新时间:7/19/2024, 6:56:47 AM

CREATE TABLE: 创建一张表

语法
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)
复制
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> 指向不存在的目录。 表属性,由键值对表示。
例 5. 创建TEXT表
CREATE TABLE student ( id INT, name STRING);
复制
ORC表
语法
CREATE TABLE <tableName> (
    <column_name> <data_type>,
    <column_name> <data_type>,
    ...
) STORED AS ORC;
复制
例 6. 创建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 。
例 7. 创建ES表
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和副本数。

例 8. 建Search外表,并与表建立映射
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)

下面,我们按照上表分析如何建立外表的列与源表的字段之间的映射关系:

  1. 源表的字段第一项 _id 为固定写法,映射于外表第一个 string 类型的列;

  2. Search外表中的列与Search源表中的字段是一一映射的,建外表的列数不得多于源表所含的字段数目,但可以少于。

  3. 源表中字段的数据类型映射成新建表中列的数据类型时,需遵循隐式转换原则,如下:

数据类型隐式转换原则

数据类型隐式转换是指数据在Search中的实际类型,能否成功映射为Esdrive中的内外表中列的数据类型,数据类型成功转换需遵循以下三点:

  • 新旧表的首列之间不存在隐式转换,必须都是 STRING 类型。

  • Search中实际存储的数据类型中的小字节类型可以转换为Esdrive中大的数据类型,但反之不可以(否则会数据丢失)。

  • 数字类型不能转换为字符类型,反之也不可以(查询结果有问题)。

Esdrive所支持的数据类型及其在Search中的实际存储的类型可参考Esdrive数据类型对照表

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类型列创建全局索引时要指定字段长度

当使用 STRING 类型的列建索引时,必须指定该列在索引词条中所占字段的长度。指定的方法为

<column> SEGMENT LENGTH <length> , <column>(<length>) 
复制
例 9. 为内表hd_inner_table创建全局索引
CREATE GLOBAL INDEX name_balance_global_index
ON hd_inner_table (name(8), balance);
复制

因列name是string类型,因此需指定长度。

例 10. 应该如何设置 SEGMENT LENGTH?

一个字段的 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分区:

partition table

假设我们要查询所有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表不能分区。
例 11. 创建分区表
建一张名为user_acc_level的表,分区键为acc_level:
DROP TABLE IF EXISTS user_acc_level;
CREATE TABLE user_acc_level (name STRING)
PARTITIONED BY (acc_level STRING);
复制

分区表建成后,分区键就可以作为一个“伪”列在查询中使用。也正因为如此,同一个表的分区键和列 不能重名

例 12. 创建分区表的错误方式

如果建分区表时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);
复制

COMPILE FAILED: Semantic error: [Error 10035] Column repeated in partitioning columns

例 13. 建多层分区表
-- 建一张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可以根据提示的数据分布选择最优的数据读取逻辑。但是表中数据的 实际 分布是在数据写入时决定的。如果写入数据的方式不当,那么表中数据将呈现出和表的元数据不同的分布(例如没有正确分桶)。所以执行导入数据的用户需要确保数据正确地被写入表中,具体操作请参考向分桶表内导数据。

例 14. 建分桶表

下面语句建一个分桶表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>[, …​] ] 选项可以只清空指定分区中的数据。

例 15. 清空数据
清空表数据
TRUNCATE TABLE user_info;
复制
清空表中指定partition数据
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表示仅影响该字段从属的表的元信息。 上面指令可以对一列的列名、列的数值类型、列在表中的位置、列的注解或者这些的任意组合做出修改。这个指令仅仅修改表的元数据。

例 16. 更改列属性
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表示仅影响该字段从属的表的元信息。
复制
例 17. 增加列
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]
复制
例 18. 替换列
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>;
复制