Hive 存储为orc的配置单元表的Drop列

Hive 存储为orc的配置单元表的Drop列,hive,Hive,我已按如下方式创建了配置单元表: create table alpha001(id int,name string)由(id)聚集成2个存储桶,存储为orc TBLProperty('transactional'='true') 现在我想删除其中一列,比如“name”。我尝试了以下方法: ALTER TABLE alpha001替换列(id int); 结果如下 Exception thrown: FAILED: Execution Error, return code 1 from org

我已按如下方式创建了配置单元表:

create table alpha001(id int,name string)由(id)聚集成2个存储桶,存储为orc TBLProperty('transactional'='true')
现在我想删除其中一列,比如“name”。我尝试了以下方法:

ALTER TABLE alpha001替换列(id int);
结果如下

Exception thrown: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Replace columns is not supported for table default.alpha001. SerDe may be incompatible.
及跟随

更改表alpha001下拉名称;

不能删除配置单元表的列。 在使用“ALTER TABLE alpha001 DROP name”时出现错误,因为不支持在配置单元中删除列,但我们无法删除分区。因此,在这里,它搜索DROP附近的分区名称,而“name”列不支持

所以为了删除列,您必须 1.删除表并重新创建表,删除列(但如果其内部表已删除,则可能导致数据丢失)
2.您可以使用REPLACE命令(参见此)

不幸的是,您不能!从现有表中删除列的唯一方法是使用
REPLACE COLUMNS
关键字。但这只能对具有本机SerDe(DynamicSerDe、MetadataTypedColumnsetSerDe、lazympleserde和ColumnarSerDe)的表执行

最好的办法是重新创建模式。遵循以下步骤

  • 检查表是否是外部的。如果不是,请使用以下语句将其设置为外部

    alter table alpha001 set tblproperties('EXTERNAL'='TRUE');
    
  • 放下桌子。由于该表是一个外部表,因此可以在不删除实际表的情况下删除它

  • 使用新架构重新创建表。您应该能够使用新架构访问表
  • 下面是一个快速样本

    create table alpha001(id int, name string) clustered by (id) into 2 buckets stored as orc TBLPROPERTIES ('transactional'='true');
    
    --assuming your table is not EXTERNAL already
    alter table alpha001 set tblproperties('EXTERNAL'='TRUE');
    
    insert into alpha001 values(1,"A");
    
    select * from alpha001;
    

    希望有帮助

    如果以错误的方式使用replace命令,则需要在使用replace命令时忽略要删除的列

    描述格式化的带扣桌子; 好啊 列名称数据类型注释

    列名称数据类型注释 id int 名字字符串 姓氏字符串

    配置单元>改变表扣的表放置列id

    不匹配的TokenException(58!=196) 位于org.antlr.runtime.baserecoverfrommatchedtoken(baserecoverizer.java:61 7) 位于org.antlr.runtime.BaseRecognizer.match(BaseRecognizer.java:115) 位于org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.dropPartitionSpec(Hiv-eParser_IdentifiersParser.java:10839) 位于org.apache.hadoop.hive.ql.parse.HiveParser.dropPartitionSpec(HiveParser.java:49854) 位于org.apache.hadoop.hive.ql.parse.HiveParser.alterStatementSuffixDropPartitions(HiveParser.java:13140) 位于org.apache.hadoop.hive.ql.parse.HiveParser.alterTableStatementSuffix(HiveParser.ja va:9370) 位于org.apache.hadoop.hive.ql.parse.HiveParser.alterStatement(HiveParser.java:8803) 位于org.apache.hadoop.hive.ql.parse.HiveParser.ddlStatement(HiveParser.java:4057) 位于org.apache.hadoop.hive.ql.parse.HiveParser.execStatement(HiveParser.java:1786) 位于org.apache.hadoop.hive.ql.parse.HiveParser.statement(HiveParser.java:1152) 位于org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:211) 位于org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:171) 位于org.apache.hadoop.hive.ql.Driver.compile(Driver.java:438) 位于org.apache.hadoop.hive.ql.Driver.compile(Driver.java:321) 位于org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:1224) 位于org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1265) 位于org.apache.hadoop.hive.ql.Driver.run(Driver.java:1161) 位于org.apache.hadoop.hive.ql.Driver.run(Driver.java:1151) 位于org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:217) 位于org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:169) 位于org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:380) 位于org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:740) 位于org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:685) 位于org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:625) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:498) 位于org.apache.hadoop.util.RunJar.run(RunJar.java:233) 位于org.apache.hadoop.util.RunJar.main(RunJar.java:148) 失败:ParseException行1:32不匹配的输入“列”,在drop PARTITION语句中的“drop”附近需要分区

    配置单元>alter table BUCKED\U table replace列(firstname字符串、lastname字符串); 好啊 所用时间:0.164秒

    蜂巢>从带扣的表格中选择*; 好啊 bucketed_table.firstname bucketed_table.lastname 3尼基尔 3尼基尔 1图图 1 avi 4塔尼 10维韦克 1图图 1 avi 4塔尼 10维韦克 5阿克什 5阿克什 所用时间:0.138秒,获取:12行

    蜂巢>描述带扣的桌子; 好啊 列名称数据类型注释 名字字符串 姓氏字符串

    所以从上面看,即使你
    create table alpha001(id int, name string) clustered by (id) into 2 buckets stored as orc TBLPROPERTIES ('transactional'='true');
    
    --assuming your table is not EXTERNAL already
    alter table alpha001 set tblproperties('EXTERNAL'='TRUE');
    
    insert into alpha001 values(1,"A");
    
    select * from alpha001;
    
    OK
    1       A
    
    drop table alpha001;
    
    create table alpha001(id int) clustered by (id) into 2 buckets stored as orc TBLPROPERTIES ('transactional'='true');
    
    select * from alpha001;
    
    OK
    1
    Time tak