Hive alter column
列名命名规则
在 Hive 0.12.0 及更早版本中,列名只能包含字母、数字和下划线。
在 Hive 版本 0.13.0 及更高版本中,默认情况下可以在反引号 (`)
内指定列名并包含任何 Unicode 字符 ,但是,点 (.) 和冒号 (😃 在查询时会产生错误。 在由反引号分隔的字符串中,除双反引号 (``) 表示一个反引号字符外,所有字符都按字面意思处理。 通过将 hive.support.quoted.identifiers
设置为 none,可以使用 0.13.0 之前的规则,在这种情况下,反引号名称被解释为正则表达式。
反引号允许对列名和表名使用保留关键字。
更改列名称/类型/位置/注释
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 及更高版本中可用。
CASCADE|RESTRICT 子句可用于 Hive 1.1.0。 ALTER TABLE CHANGE COLUMN with CASCADE 命令更改表的列的元数据,并将相同的更改级联到所有分区元数据。 RESTRICT 是默认值,将列更改限制为仅对表元数据进行更改。
column change命令只会修改Hive的元数据,不会修改数据。 用户应确保表/分区的实际数据布局符合元数据定义。
示例:
CREATE TABLE test_change (a int, b int, c int);
// 首先把a的列名改为a1
ALTER TABLE test_change CHANGE a a1 INT;
//然后把a1的列名改为a2,数据类型改为string,并将其放在 b 列之后。
ALTER TABLE test_change CHANGE a1 a2 STRING AFTER b;
// 新表的结构是:b int, a2 string, c int.
//把c的列名改为c1,并放到第一列。
ALTER TABLE test_change CHANGE c c1 INT FIRST;
// 新表的结构是: c1 int, b int, a2 string.
// 给列a1加入注释
ALTER TABLE test_change CHANGE a1 a1 INT COMMENT 'this is column a1';
添加/替换列
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 在现有列的末尾但在分区列之前添加新列。
REPLACE COLUMNS 删除所有现有列并添加新的列集。 只能用于具有本机 SerDe(DynamicSerDe、MetadataTypedColumnsetSerDe、LazySimpleSerDe 和 ColumnarSerDe)的表。 REPLACE COLUMNS 也可用于删除列。 例如,“ALTER TABLE test_change REPLACE COLUMNS (a int, b int);” 将从 test_change 表中删除列 'c'。
CASCADE|RESTRICT 子句在 Hive 1.1.0 中可用。 ALTER TABLE ADD|REPLACE COLUMNS with CASCADE 命令更改表元数据的列,并将相同的更改级联到所有分区元数据。 RESTRICT 是默认设置,将列更改限制为仅对表元数据进行更改。
部分分区规范
从 Hive 0.14 (HIVE-8411) 开始,用户可以为ALTER TABLE语句提供部分分区规范,类似于动态分区。 因此,不必为每个需要更改的分区更改列语句:
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需要设置为true才能使用ALTER PARTITION开启动态分区
SET hive.exec.dynamic.partition = true;
//改变ds='2008-04-08'这个分区
ALTER TABLE foo PARTITION (ds='2008-04-08', hr) CHANGE COLUMN dec_column_name dec_column_name DECIMAL(38,18);
//修改分区
ALTER TABLE foo PARTITION (ds, hr) CHANGE COLUMN dec_column_name dec_column_name DECIMAL(38,18);
与动态分区类似,hive.exec.dynamic.partition
必须设置为 true 才能在 ALTER PARTITION 期间启用部分分区规范。 支持以下操作:
更改列、添加列、替换列、文件格式、SerDe属性