我的hive表创建如下:
创建由(id)聚集的表alpha001(id int,name string)到存储为orc的2个桶中TBLPROPERTIES('transactional'='true')
现在我要删除其中一列,说'name'。我尝试了以下方法:
抛出异常:FAILED:执行错误,从org.apache.hadoop.hive.ql.exec.DDLTask返回代码1。表default.alpha001不支持替换列。 SerDe可能不兼容。
抛出异常:FAILED:ParseException行1:26不匹配的输入'name'期望删除分区语句中'DROP'附近的PARTITION
有人可以帮我吗?请
答案 0 :(得分:3)
不幸的是,你不能!您可以使用REPLACE COLUMNS
关键字从现有表中删除列的唯一方法。但这只能用于具有本机SerDe(DynamicSerDe,MetadataTypedColumnsetSerDe,LazySimpleSerDe和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;
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
希望有所帮助!
答案 1 :(得分:0)
你不能删除hive表的列。 在使用“ALTER TABLE alpha001 DROP name”时,它会给出错误,因为在hive drop列中不支持但我们不能删除partition.So在这里,它会搜索“name”列附近的分区名称。
因此,为了删除列,您必须这样做 1.drop table并重新创建表,删除列(但如果其内部表可能导致数据丢失) 2.您可以使用REPLACE命令(请参阅此https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-AlterTable/Partition/Column)
答案 2 :(得分:0)
您以错误的方式使用了替换命令,您需要省略要使用替换命令时要删除的列。
描述格式化的bucketed_table; 好 col_name data_type注释
id int 名字字符串 姓氏字符串
hive>更改表bucketed_table删除列ID;
MismatchedTokenException(58!= 196) 在org.antlr.runtime.BaseRecognizer.recoverFromMismatchedToken(BaseRecognizer.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(Hive Parser.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的输入“列”不匹配,期望在放置分区语句中的“放置”附近存在PARTITION
hive>更改表bucketed_table替换列(名字字符串,姓氏字符串); 好 耗时:0.164秒
hive>从bucketed_table中选择*; 好 bucketed_table.firstname bucketed_table.lastname 3尼希尔 3尼希尔 1图图 1个AVI 4坦维 10 vivek 1图图 1个AVI 4坦维 10 vivek 5阿克舍 5阿克舍 花费时间:0.138秒,获取:12行
hive>描述bucketed_table; 好 col_name data_type注释 名字字符串 姓氏字符串
因此即使您替换了该列,也可以从上方进行操作,如果在该列上完成了存储操作,它仍然会保留,但是如果该列上没有存储功能,那么它将同时从元数据和hdfs中删除。
答案 3 :(得分:0)
我刚刚发现我们无法删除存储为ORC的表中的列。唯一的方法是我们可以使用“创建表为选择”选项来创建具有所需列的新表。