无法从配置单元表中删除列

时间:2017-07-12 18:06:43

标签: hive

我无法使用现有配置单元外部表中的ALTER删除列

Hive版本是CDH 5.5内的hive 1.1

 hive> create external table alter_test(id int,name string)
> row format delimited
> fields terminated by ','
> location '/user/cloudera/conf_files';
OK
 Time taken: 0.132 seconds
 hive> select * from alter_test;
 OK
 100     surender
 101     raja
 Time taken: 0.141 seconds, Fetched: 2 row(s)
  hive> alter table alter_test ADD COLUMNS (deviceid string,mode string,channels int,action_name string,data_countt int);
 OK
 Time taken: 0.2 seconds
 hive> show create table alter_test;
 OK
 CREATE EXTERNAL TABLE `alter_test`(
`id` int,
`name` string,
`deviceid` string,
`mode` string,
`channels` int,
`action_name` string,
`data_countt` int)
 ROW FORMAT DELIMITED
 FIELDS TERMINATED BY ','
 STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
 OUTPUTFORMAT
 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
 'hdfs://nameservice1/user/cloudera/conf_files'
 TBLPROPERTIES (
 'COLUMN_STATS_ACCURATE'='false',
   'last_modified_by'='build',
   'last_modified_time'='1500048081',
   'numFiles'='0',
   'numRows'='-1',
   'rawDataSize'='-1',
   'totalSize'='0',
   'transient_lastDdlTime'='1500048081')
   Time taken: 0.049 seconds, Fetched: 25 row(s)
  hive> select * from alter_test;
  OK
 100     surender        NULL    NULL    NULL    NULL    NULL
 101     raja    NULL    NULL    NULL    NULL    NULL
   Time taken: 0.123 seconds, Fetched: 2 row(s)
      hive> alter table alter_test drop deviceid;
       MismatchedTokenException(26!=187)
    at org.antlr.runtime.BaseRecognizer.recoverFromMismatchedToken(BaseRecognizer.java:617)
    at org.antlr.runtime.BaseRecognizer.match(BaseRecognizer.java:115)
    at    org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.dropPartitionSpec(HiveParser_IdentifiersParser.java:10571)
    at org.apache.hadoop.hive.ql.parse.HiveParser.dropPartitionSpec (HiveParser.java:44608)
    at org.apache.hadoop.hive.ql.parse.HiveParser.alterStatementSuffixDropPartitions(HiveParser.java:11198)
    at org.apache.hadoop.hive.ql.parse.HiveParser.alterTableStatementSuffix(HiveParser.java:7748)
    at org.apache.hadoop.hive.ql.parse.HiveParser.alterStatement(HiveParser.java:6960)
    at org.apache.hadoop.hive.ql.parse.HiveParser.ddlStatement(HiveParser.java:2409)
    at org.apache.hadoop.hive.ql.parse.HiveParser.execStatement(HiveParser.java:1586)
    at org.apache.hadoop.hive.ql.parse.HiveParser.statement(HiveParser.java:1062)
    at org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:199)
    at org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:166)
    at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:393)
    at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:305)
    at org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:1110)
    at org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1158)
    at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1047)
    at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1037)
    at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:207)
    at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:159)
    at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:370)
    at org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:756)
    at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:675)
    at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:615)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
       FAILED: ParseException line 1:28 mismatched input 'deviceid' expecting PARTITION near 'drop' in drop partition statement
       hive> alter table alter_test drop column  deviceid;
       MismatchedTokenException(57!=187)
    at org.antlr.runtime.BaseRecognizer.recoverFromMismatchedToken(BaseRecognizer.java:617)
    at org.antlr.runtime.BaseRecognizer.match(BaseRecognizer.java:115)
    at org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.dropPartitionSpec(HiveParser_IdentifiersParser.java:10571)
    at org.apache.hadoop.hive.ql.parse.HiveParser.dropPartitionSpec(HiveParser.java:44608)
    at org.apache.hadoop.hive.ql.parse.HiveParser.alterStatementSuffixDropPartitions(HiveParser.java:11198)
    at org.apache.hadoop.hive.ql.parse.HiveParser.alterTableStatementSuffix(HiveParser.java:7748)
    at org.apache.hadoop.hive.ql.parse.HiveParser.alterStatement(HiveParser.java:6960)
    at org.apache.hadoop.hive.ql.parse.HiveParser.ddlStatement(HiveParser.java:2409)
    at org.apache.hadoop.hive.ql.parse.HiveParser.execStatement(HiveParser.java:1586)
    at org.apache.hadoop.hive.ql.parse.HiveParser.statement(HiveParser.java:1062)
    at org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:199)
    at org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:166)
    at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:393)
    at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:305)
    at org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:1110)
    at org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1158)
    at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1047)
    at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1037)
    at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:207)
    at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:159)
    at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:370)
    at org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:756)
    at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:675)
    at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:615)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
   FAILED: ParseException line 1:28 mismatched input 'column' expecting PARTITION near 'drop' in drop partition statement

是否有解决此问题的方法?

2 个答案:

答案 0 :(得分:0)

最好创建一个新表a,然后从旧表中插入表a,在删除旧表之后,最后将a重命名为旧表名。

答案 1 :(得分:0)

Hive目前没有删除列的命令。

可以通过定义一组新列来隐式删除列 -

alter table alter_test 
replace columns
(id int,name string,mode string,channels int,action_name string,data_countt int)
;

但是,在你的情况下,它会引发异常 -

  

无法更改表格   以下列具有不兼容的类型   将现有列放在各自的位置:
  信道,data_countt,
  查询:alter table alter_test替换列   (id int,name string,mode string,channels int,action_name   string,data_countt int)。

我们可以分两个阶段来解决这个问题 -

1

alter table alter_test 
replace columns
(id int,name string)
;

2

alter table alter_test 
add columns
(mode string,channels int,action_name string,data_countt int)
;

P.S。
只是为了说清楚 -
所有更改仅在元数据级别完成 数据没有改变。

P.S。 2
当然,您可以删除外部表并重新创建它......

相关问题