【发布时间】: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) 时,
< 小于号时发生错误。
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.
在没有< 的结构列的情况下成功。这个问题我该怎么办?
【问题讨论】:
-
该表是外部的。您可以删除它并使用正确的定义创建,数据将保持原样
-
@leftjoin 是的,但是表有很多分区并且被其他人使用。所以如果可能的话,我想改变而不放弃..
-
您还可以在同一位置创建另一个外部表并恢复分区。删除原来的,重命名表
-
@leftjoin 恢复分区可以通过 MSCK 轻松完成。谢谢! (MSCK REPAIR TABLE table_name;)