更改蜂巢表添加或删除列

Ary*_*ngh 22 hadoop hive

我在hive中有orc表我想从这个表中删除列

ALTER TABLE table_name drop  col_name;
Run Code Online (Sandbox Code Playgroud)

但我得到以下例外

执行配置单元查询时出错:OK FAILED:ParseException行1:35不匹配输入'user_id1'期望删除分区语句中'丢弃'附近的PARTITION

任何人都可以帮助我或提供任何想法吗?请注意,我是using hive 0.14

Ree*_*yay 28

您不能使用命令直接从表中删除列 ALTER TABLE table_name drop col_name;

删除列的唯一方法是使用replace命令.可以说,我有一个带有id,name和dept列的表emp.我想删除表emp的id列.因此,在replace columns子句中提供您希望成为表的一部分的所有列.下面的命令将从emp表中删除id列.

 ALTER TABLE emp REPLACE COLUMNS( name string, dept string);
Run Code Online (Sandbox Code Playgroud)

  • 我遇到了同样的问题,尝试用上述方法替换列,但失败,失败:执行错误,从org.apache.hadoop.hive.ql.exec.DDLTask返回代码1。替换列不能删除表sandbox6.alc_ont_oe_order_headers_all的列。SerDe可能不兼容 (2认同)

小智 5

假设您有一个外部表,即。Organization.employee为:(不包括 TBLPROPERTIES)

hive> show create table organization.employee;
OK
CREATE EXTERNAL TABLE `organization.employee`(
      `employee_id` bigint,
      `employee_name` string,
      `updated_by` string,
      `updated_date` timestamp)
    ROW FORMAT SERDE
      'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
    STORED AS INPUTFORMAT
      'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
    OUTPUTFORMAT
      'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
    LOCATION
      'hdfs://getnamenode/apps/hive/warehouse/organization.db/employee'
Run Code Online (Sandbox Code Playgroud)

您想要从表中删除updated_by、updated_date列。按着这些次序:

创建 Organization.employee 的临时表副本,如下所示:

hive> create table organization.employee_temp as select * from organization.employee;
Run Code Online (Sandbox Code Playgroud)

删除主表organization.employee。

hive> drop table organization.employee;
Run Code Online (Sandbox Code Playgroud)

从 HDFS 中删除底层数据(需要从 hive shell 中出来)

[nameet@ip-80-108-1-111 myfile]$ hadoop fs -rm hdfs://getnamenode/apps/hive/warehouse/organization.db/employee/*
Run Code Online (Sandbox Code Playgroud)

根据需要创建删除了列的表:

hive> CREATE EXTERNAL TABLE `organization.employee`(
  `employee_id` bigint,
  `employee_name` string)
ROW FORMAT SERDE
  'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
  'hdfs://getnamenode/apps/hive/warehouse/organization.db/employee'
Run Code Online (Sandbox Code Playgroud)

将原始记录插入回原始表中。

hive> insert into organization.employee 
select employee_id, employee_name from organization.employee_temp;
Run Code Online (Sandbox Code Playgroud)

最后删除创建的临时表

hive> drop table organization.employee_temp;
Run Code Online (Sandbox Code Playgroud)


小智 5

实现最终目标的另一种“哑巴”方法是创建一个不需要表的新表。使用Hive的正则表达式匹配将使此操作变得很容易。

这是我会做的:

-- make a copy of the old table
ALTER TABLE table RENAME TO table_to_dump;

-- make the new table without the columns to be deleted
CREATE TABLE table AS
SELECT `(col_to_remove_1|col_to_remove_2)?+.+`
FROM table_to_dump;

-- dump the table 
DROP TABLE table_to_dump;
Run Code Online (Sandbox Code Playgroud)

如果所讨论的表不是太大,则应该可以正常工作。