我在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
答案 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