删除存储为orc的hive表的列

时间:2015-08-18 09:43:29

标签: hive

我的hive表创建如下:

创建由(id)聚集的表alpha001(id int,name string)到存储为orc的2个桶中TBLPROPERTIES('transactional'='true')

现在我要删除其中一列,说'name'。我尝试了以下方法:

  1. ALTER TABLE alpha001 REPLACE COLUMNS(id int)
  2. 抛出异常:FAILED:执行错误,从org.apache.hadoop.hive.ql.exec.DDLTask返回代码1。表default.alpha001不支持替换列。 SerDe可能不兼容。

    1. ALTER TABLE alpha001 DROP name
    2. 抛出异常:FAILED:ParseException行1:26不匹配的输入'name'期望删除分区语句中'DROP'附近的PARTITION

      有人可以帮我吗?请

4 个答案:

答案 0 :(得分:3)

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

您最好的选择是重新创建架构。按照步骤进行。

  1. 检查表格是否为外部表格。如果不是,请使用以下语句将其设为外部。

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

  3. 使用新架构重新创建表。您应该能够使用新架构访问该表。
  4. 快速下载样本。

    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注释

col_name数据类型注释

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注释 名字字符串 姓氏字符串

enter image description here

因此即使您替换了该列,也可以从上方进行操作,如果在该列上完成了存储操作,它仍然会保留,但是如果该列上没有存储功能,那么它将同时从元数据和hdfs中删除。

答案 3 :(得分:0)

我刚刚发现我们无法删除存储为ORC的表中的列。唯一的方法是我们可以使用“创建表为选择”选项来创建具有所需列的新表。