更改蜂巢表添加或删除列

时间:2015-12-10 09:31:02

标签: hadoop hive

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

ALTER TABLE table_name drop  col_name;

但我收到以下异常

  

执行配置单元查询时出错:OK FAILED:ParseException line 1:35输入不匹配' user_id1'期待PARTITION接近' drop'在drop partition语句中

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

7 个答案:

答案 0 :(得分:20)

您不能使用命令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);

答案 1 :(得分:4)

假设你有一个外部表即。 organization.employee as :(不包括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'

您想从表格中删除 updated_by,updated_date 列。请按照以下步骤操作:

将organization.employee的临时表副本创建为:

hive> create table organization.employee_temp as select * from organization.employee;

删除主表organization.employee。

hive> drop table organization.employee;

从HDFS中删除基础数据(需要从hive shell中删除)

[nameet@ip-80-108-1-111 myfile]$ hadoop fs -rm hdfs://getnamenode/apps/hive/warehouse/organization.db/employee/*

根据需要创建包含已删除列的表:

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'

将原始记录插回原始表格。

hive> insert into organization.employee 
select employee_id, employee_name from organization.employee_temp;

最后删除创建的临时表

hive> drop table organization.employee_temp;

答案 2 :(得分:2)

ALTER TABLE emp REPLACE COLUMNS( name string, dept string);

上述语句只能更改表的架构,而不能更改数据。 解决此问题的方法是在新表中复制数据。

Insert <New Table> Select <selective columns> from <Old Table> 

答案 3 :(得分:2)

还有一种“哑巴”的方法来达到最终目的,即创建一个不需要表的新表。使用Hive的regex匹配将使此操作变得很容易。

这就是我要做的:

-- 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;

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

答案 4 :(得分:0)

非本机表尚不支持ALTER TABLE;即在指定STORED BY子句时使用CREATE TABLE得到的结果。

检查此https://cwiki.apache.org/confluence/display/Hive/StorageHandlers

答案 5 :(得分:-1)

对于外部表,它简单易行。 只需删除表架构,然后编辑create table schema,最后再次使用新架构创建表。 示例表:aparup_test.tbl_schema_change,将删除列ID 步骤:-

------------- show create table to fetch schema ------------------

spark.sql("""
show create table aparup_test.tbl_schema_change
""").show(100,False)

o/p:
CREATE EXTERNAL TABLE aparup_test.tbl_schema_change(name STRING, time_details TIMESTAMP, id BIGINT)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = '1'
)
STORED AS
  INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
  OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 'gs://aparup_test/tbl_schema_change'
TBLPROPERTIES (
  'parquet.compress' = 'snappy'
)
""")

------------- drop table --------------------------------

spark.sql("""
drop table aparup_test.tbl_schema_change
""").show(100,False)

------------- edit create table schema by dropping column "id"------------------

CREATE EXTERNAL TABLE aparup_test.tbl_schema_change(name STRING, time_details TIMESTAMP)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = '1'
)
STORED AS
  INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
  OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 'gs://aparup_test/tbl_schema_change'
TBLPROPERTIES (
  'parquet.compress' = 'snappy'
)
""")

------------- sync up table schema with parquet files ------------------

spark.sql("""
msck repair table aparup_test.tbl_schema_change
""").show(100,False)

==================== DONE =====================================

答案 6 :(得分:-5)

即使是以下查询也适合我。

Alter table tbl_name drop col_name