更改 hive 表添加或删除列

问题描述 投票:0回答:9

我在配置单元中有 orc 表,我想从该表中删除列

ALTER TABLE table_name drop  col_name;

但是我遇到以下异常

执行配置单元查询时发生错误:OK FAILED:ParseException line 1:35 不匹配的输入“user_id1”期望在 drop 分区语句中靠近“drop”的 PARTITION

任何人都可以帮助我或提供任何想法来做到这一点吗?注意,我是

using hive 0.14

hadoop hive
9个回答
47
投票

您无法使用命令直接从表中删除列

ALTER TABLE table_name drop  col_name;

删除列的唯一方法是使用替换命令。可以说,我有一个表 emp,其中包含 id、name 和 dept 列。我想删除表 emp 的 id 列。因此,请在替换列子句中提供您想要成为表一部分的所有列。下面的命令将从 emp 表中删除 id 列。

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

11
投票

还有一种“愚蠢”的方式来实现最终目标,即创建一个没有不需要的列的新表。使用 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;

如果相关表格不是太大,这应该可以很好地工作。


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'

您想要从表中删除 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
投票
ALTER TABLE emp REPLACE COLUMNS( name string, dept string);

以上语句只能更改表的模式,不能更改数据。 这个问题的解决方案是将数据复制到新表中。

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

1
投票

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

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


0
投票

经过很多错误,除了上面的解释之外,我会添加更简单的答案。

案例 1:添加名为

new_column

的新列
ALTER TABLE schema.table_name
ADD new_column INT COMMENT 'new number column');

案例 2:将列

new_column
重命名为
no_of_days

ALTER TABLE schema.table_name 
CHANGE new_column no_of_days INT;

请注意,在重命名时,两列应与上面的

datatype
相同,如
INT


0
投票

删除列的另一种方法是将表格转换为

external

如何将hive表转换为外部

从蜂巢中删除桌子。这只会删除表的元数据,同时保留 hdfs 中的基础数据。

删除表db.tableName;

通过删除列并使用新架构再次创建表并为表提供 msck

创建表tableName(使用新架构)

msck 修复表 db.tableName;

有关配置单元内部和外部表的更多详细信息,您可以点击以下链接https://stackoverflow.com/a/17038740/21929497[内部和外部表配置单元]2


-1
投票

对于外部表来说,它简单又容易。 只需删除表架构,然后编辑创建表架构,最后再次使用新架构创建表。 示例表: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 =====================================

-7
投票

即使下面的查询也对我有用。

Alter table tbl_name drop col_name
© www.soinside.com 2019 - 2024. All rights reserved.