在 hive 的分区级别添加列
Posted
技术标签:
【中文标题】在 hive 的分区级别添加列【英文标题】:Adding Column at partition level in hive 【发布时间】:2018-09-27 13:44:50 【问题描述】:我是 hive 的新手,我们需要向现有的 hive 表添加列。 我在以下命令的帮助下做到了这一点。 alter table tableName add columns (colName datatype) cascade;
但是在 hive 文档中,我们有 alter 命令在分区级别添加列。 我尝试了以下命令。
hive> SET hive.exec.dynamic.partition = true;
hive> alter table test_alter_col partition(c=1) add columns (d1 int);
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Duplicate column name: d1
hive> select d1 from test_alter_col where c=1;
FAILED: SemanticException [Error 10004]: Line 1:7 Invalid table alias or column reference 'd1': (possible column names are: a1, b1, d, c)
hive> alter table test_alter_col partition(c=1) add columns (d2 int);
OK
Time taken: 0.178 seconds
hive> select d2 from test_alter_col where c=1;
FAILED: SemanticException [Error 10004]: Line 1:7 Invalid table alias or column reference 'd2': (possible column names are: a1, b1, d, c)
hive>
上述命令究竟做了什么,在分区级别使用alter命令有什么用例。
编辑 1 -
也试过下面的命令,但我仍然无法查询新添加的列,也无法插入数据。
create table test_partn (a int, b int, c int) partitioned by (d int) row format delimited fields terminated by '\t' stored as textfile;
insert into table test_partn partition(d) values (1, 11, 111, 1111), (2, 22, 222, 2222), (3, 33, 333, 3333);
SET hive.exec.dynamic.partition = true;
alter table test_partn partition(d=1111) add columns (e int);
insert into test_partn partition(d=1111) values (1, 12, 13, 14);
FAILED: SemanticException [Error 10044]: Line 1:12 Cannot insert into target table because column number/types are different '1111': Table insclause-0 has 3 columns, but query has 4 columns.
alter table test_partn partition(d=3333) add columns (e int) restrict;
insert into test_partn partition(d=3333) values (1, 12, 13, 14);
谢谢你, 维杰
【问题讨论】:
【参考方案1】:hive> alter table test_alter_col partition(c=1) add columns (d1 int); 失败:执行错误,从 org.apache.hadoop.hive.ql.exec.DDLTask 返回代码 1。重复的列名:d1 h
关于您的第一个命令,您的配置单元表中似乎已经存在重复的列名。您需要使用不同的列。
或者,如果您想向已分区的配置单元表添加列,可以使用以下命令:
ALTER TABLE <table name> ADD columns (column1 string) CASCADE;
以上内容应该可以完成将列添加到已分区表的工作。 Catch here 是 CASCADE 关键字,它将级联对 hive 中所有分区的更改。
希望这会有所帮助:)
【讨论】:
是的,我可以使用级联向所有分区添加列,但是当我为单个分区添加添加列时,我无法查询该列 (d2) 或添加相同的列再次(之前添加的 d1)。想知道当我们将列添加到单个分区而不是全部时会发生什么。希望你能得到我的问题【参考方案2】:我认为在分区级别添加列只会在元数据级别添加列名。
我尝试了查询 - describe extended tablename partition (keycol=value)
以下是结果。
hive> describe extended test_partn partition(d=1111);
OK
a int
b int
c int
e int
d int
# Partition Information
# col_name data_type comment
d int
Detailed Partition Information Partition(values:[1111], dbName:test, tableName:test_partn, createTime:1539261860, lastAccessTime:0, sd:StorageDescriptor(cols:[FieldSchema(name:a, type:int, comment:null), FieldSchema(name:b, type:int, comment:null), FieldSchema(name:c, type:int, comment:null), FieldSchema(name:e, type:int, comment:null), FieldSchema(name:d, type:int, comment:null)], location:maprfs:/user/hive/warehouse/test.db/test_partn/d=1111, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:serialization.format= , field.delim=
Time taken: 0.139 seconds, Fetched: 12 row(s)
hive>
我只能看到这个分区新增的列
【讨论】:
以上是关于在 hive 的分区级别添加列的主要内容,如果未能解决你的问题,请参考以下文章