我在配置单元中有 orc 表,我想从该表中删除列
ALTER TABLE table_name drop col_name;
但是我遇到以下异常
执行配置单元查询时发生错误:OK FAILED:ParseException line 1:35 不匹配的输入“user_id1”期望在 drop 分区语句中靠近“drop”的 PARTITION
任何人都可以帮助我或提供任何想法来做到这一点吗?注意,我是
using hive 0.14
您无法使用命令直接从表中删除列
ALTER TABLE table_name drop col_name;
删除列的唯一方法是使用替换命令。可以说,我有一个表 emp,其中包含 id、name 和 dept 列。我想删除表 emp 的 id 列。因此,请在替换列子句中提供您想要成为表一部分的所有列。下面的命令将从 emp 表中删除 id 列。
ALTER TABLE emp REPLACE COLUMNS( name string, dept string);
还有一种“愚蠢”的方式来实现最终目标,即创建一个没有不需要的列的新表。使用 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;
如果相关表格不是太大,这应该可以很好地工作。
假设您有一个外部表,即。 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;
ALTER TABLE emp REPLACE COLUMNS( name string, dept string);
以上语句只能更改表的模式,不能更改数据。 这个问题的解决方案是将数据复制到新表中。
Insert <New Table> Select <selective columns> from <Old Table>
非本机表尚不支持 ALTER TABLE;即当指定 STORED BY 子句时使用 CREATE TABLE 得到的结果。
检查这个https://cwiki.apache.org/confluence/display/Hive/StorageHandlers
经过很多错误,除了上面的解释之外,我会添加更简单的答案。
案例 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
删除列的另一种方法是将表格转换为
external
从蜂巢中删除桌子。这只会删除表的元数据,同时保留 hdfs 中的基础数据。
删除表db.tableName;
通过删除列并使用新架构再次创建表并为表提供 msck
创建表tableName(使用新架构)
msck 修复表 db.tableName;
有关配置单元内部和外部表的更多详细信息,您可以点击以下链接https://stackoverflow.com/a/17038740/21929497[内部和外部表配置单元]2
对于外部表来说,它简单又容易。 只需删除表架构,然后编辑创建表架构,最后再次使用新架构创建表。 示例表: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 =====================================
即使下面的查询也对我有用。
Alter table tbl_name drop col_name