Hive更改表列名

37

我想在Hive中重命名一个列名。是否有一种方法可以在Hive中重命名列名。

tableA(column1,_c1,_c2) 改为 tableA(column1,column2,column3) ??

4个回答

98

改变列名/类型/位置/注释:

ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]

例子:

CREATE TABLE test_change (a int, b int, c int);

// will change column a's name to a1
ALTER TABLE test_change CHANGE a a1 INT;

38
当重命名自动从查询生成的列名时,例如来自OP的_c1,您需要用反引号将名称括起来。 - libjack
1
谢谢,这个评论非常有用。我在很多地方寻找这个解决方案,但没有找到。关于什么是反引号 - http://askubuntu.com/questions/20034/differences-between-doublequotes-singlequotes-and-backticks-%C2%B4-%C2%B4-on-comm - ShikharDua
感谢libjack。括号对我不起作用,但是`可以。 - fishautumn
7
请注意,如果表是Parquet格式的,则更改列不会更改任何底层数据。也就是说,如果表中已经有数据,重命名列不会使该列中的数据在新名称下可访问: select a from test_change; 1 alter table test_change change a a1 int; select a1 from test_change; null - mike_pdb
@mike_pdb:我不确定那是故意的。我明白为什么会发生这种情况,也许ORC也有同样的问题,但我不确定它是“按设计来的”。你能创建一个JIRA吗?https://issues.apache.org/jira - Remus Rusanu
显示剩余2条评论

7

"use"命令必须首先用于定义工作数据库,才能使用该命令。使用DATABASE.TABLE的表列重命名语法会导致错误并且无法正常工作。版本:HIVE 0.12。

示例:

hive> ALTER TABLE databasename.tablename CHANGE old_column_name new_column_name;

  MismatchedTokenException(49!=90)
        at org.antlr.runtime.BaseRecognizer.recoverFromMismatchedToken(BaseRecognizer.java:617)
        at org.antlr.runtime.BaseRecognizer.match(BaseRecognizer.java:115)
        at org.apache.hadoop.hive.ql.parse.HiveParser.alterStatementSuffixExchangePartition(HiveParser.java:11492)
        ...

hive> use databasename;

hive> ALTER TABLE tablename CHANGE old_column_name new_column_name;

OK

6
alter table table_name change old_col_name new_col_name new_col_type;

以下是示例

hive> alter table test change userVisit userVisit2 STRING;      
    OK
    Time taken: 0.26 seconds
    hive> describe test;                                      
    OK
    uservisit2              string                                      
    category                string                                      
    uuid                    string                                      
    Time taken: 0.213 seconds, Fetched: 3 row(s)

2
在评论中@libjack提到了一个非常重要的观点,我想更详细地说明一下。首先,我们可以通过describe <table_name>; 命令检查表的列是什么。 enter image description here 有一个名为_c1的双列,并且这些列是由Hive自己创建的,当我们从一张表移动数据到另一张表时会出现这种情况。要处理这些列,我们需要在反引号内将其写入。
`_c1`

最后,ALTER命令将会是这样的:
ALTER TABLE <table_namr> CHANGE `<system_genarated_column_name>` <new_column_name> <data_type>;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接