【问题标题】:Hive Alter table change Column NameHive Alter 表更改列名
【发布时间】:2014-03-29 06:38:39
【问题描述】:

我正在尝试重命名 Hive 中的 columnName。有没有办法在 Hive 中重命名列名。

tableA (column1 ,_c1,_c2) 到 表 A(第 1 列、第 2 列、第 3 列) ??

【问题讨论】:

    标签: hive alter-table alter


    【解决方案1】:

    Change Column Name/Type/Position/Comment:

    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;
    

    【讨论】:

    • 在重命名查询自动生成的列名时,例如 OP 中的 _c1、_c1,您必须用反引号将名称括起来
    • 谢谢,这个评论很有用。我在很多地方都找不到这个解决方案。什么是反勾号 - askubuntu.com/questions/20034/…
    • 感谢 libjack。方括号对我不起作用,但 ` 可以。
    • 请注意,如果是 parquet 表,列更改不会更改任何基础数据。也就是说,如果表中已经有数据,重命名列不会使该列中的数据可以在新名称下访问:select a from test_change; 1 更改表 test_change 更改 a1 int;从 test_change 中选择 a1;空
    • @mike_pdb:我不确定这是有意的。我理解它为什么会发生,也许 ORC 也有同样的问题,但我不确定是“设计使然”。你能创建一个JIRA吗? issues.apache.org/jira
    【解决方案2】:

    仅当“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
    

    【讨论】:

      【解决方案3】:
      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)
      

      【讨论】:

        【解决方案4】:

        在 cmets @libjack 中提到了非常重要的一点。我想更多地说明它。首先,我们可以通过describe <table_name>; 命令检查表的列。

        有一个名为 _c1 的双列,当我们将数据从一个表移动到另一个表时,这些列是由 hive 本身创建的。为了解决这些列,我们需要将其写在反引号内

        `_c1`
        

        最后,ALTER 命令将是,

        ALTER TABLE <table_namr> CHANGE `<system_genarated_column_name>` <new_column_name> <data_type>;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-12-21
          • 1970-01-01
          • 2019-02-05
          • 2017-08-05
          • 2020-08-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多