Hive alter column

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属性

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值