【问题标题】:Hive alter table column fails when it has struct columnHive 更改表列在具有结构列时失败
【发布时间】:2021-12-24 17:32:14
【问题描述】:

我已经创建了 hive 外部表。

CREATE EXTERNAL TABLE test_db.test_table (
   `testfield` string,
   `teststruct` struct<teststructfield:string>
   )
 ROW FORMAT SERDE                                   
   'org.apache.hive.hcatalog.data.JsonSerDe'        
 STORED AS INPUTFORMAT                              
   'org.apache.hadoop.mapred.TextInputFormat'       
 OUTPUTFORMAT                                       
   'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' 
 LOCATION                                           
   'hdfs://some/path';


hive> describe test_table;

+-------------+---------------------------------+--------------------+
|  col_name   |            data_type            |      comment       |
+-------------+---------------------------------+--------------------+
| testfield   | string                          | from deserializer  |
| teststruct  | struct<teststructfield:string>  | from deserializer  |
+-------------+---------------------------------+--------------------+

我想更改表格列。
但是当表有结构列 (teststruct) 时, &lt; 小于号时发生错误。

ALTER TABLE test_db.test_table CHANGE COLUMN testfield testfield2 string;

INFO  : Semantic Analysis Completed (retrial = false)
INFO  : Returning Hive schema: Schema(fieldSchemas:null, properties:null)
INFO  : Concurrency mode is disabled, not creating a lock manager
INFO  : Starting task [Stage-0:DDL] in serial mode
ERROR : FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Error: type expected at the position 7 of 'string:<derived from deserializer>' but '<' is found.

在没有&lt; 的结构列的情况下成功。这个问题我该怎么办?

【问题讨论】:

  • 该表是外部的。您可以删除它并使用正确的定义创建,数据将保持原样
  • @leftjoin 是的,但是表有很多分区并且被其他人使用。所以如果可能的话,我想改变而不放弃..
  • 您还可以在同一位置创建另一个外部表并恢复分区。删除原来的,重命名表
  • @leftjoin 恢复分区可以通过 MSCK 轻松完成。谢谢! (MSCK REPAIR TABLE table_name;)

标签: hive hiveddl


【解决方案1】:

如果没有其他帮助,作为一种解决方法,您可以删除/创建表并恢复分区。该表是EXTERNAL的,drop不会影响数据。

(1) 删除表

DROP TABLE test_db.test_table;

(2) 使用所需列名创建表

CREATE EXTERNAL TABLE test_db.test_table (
   testfield2 string,
   teststruct struct<teststructfield:string>
   )
   PARTITIONED BY (....)
 ROW FORMAT SERDE                                   
   'org.apache.hive.hcatalog.data.JsonSerDe'        
 LOCATION                                           
   'hdfs://some/path';

(3) 恢复分区

MSCK REPAIR TABLE test_db.test_table;

或者如果您在 EMR 上运行 Hive:

ALTER TABLE test_db.test_table RECOVER PARTITIONS; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2017-08-08
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多