我在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)
小智 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)
如果所讨论的表不是太大,则应该可以正常工作。
| 归档时间: |
|
| 查看次数: |
51923 次 |
| 最近记录: |