2016-03-05 83 views
1

当我试图插入Partiotioned表时,出现波纹管错误 SemanticException [Error 10044]:Line 1 :23不能插入到目标表中,因为列号/类型不同'US'':表inslace-0有2列,但查询有3列。插入Hive表 - 不能插入到目标表中,因为列号/类型

我的输入数据

1,aaa,US 
2,bbb,US 
3,ccc,IN 
4,ddd,US 
5,eee,IN 
6,fff,IN 
7,ggg,US 

创建蜂巢表TX

create table tx (no int,name string,country string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; 

创建按国家划分分区表T1

create table t1 (no int,name string) PARTITIONED BY (country string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; 

我试过波纹管两个插入,但未能

INSERT OVERWRITE TABLE t1 PARTITION (country='US') 
SELECT * from tx where country = 'US'; 

    INSERT OVERWRITE TABLE t1 PARTITION (country='US') 
SELECT no,name,country from tx where country = 'US'; 

错误:SemanticException [错误10044]:行1:23无法插入到目标表,因为列数/类型不同的'US'':表insreg-0具有2列,但查询具有3列。

+3

RTFM - 海夫不是甲骨文。在Hive中,分区“列”作为**元数据**进行管理,它们不包含在数据文件中,而是用作子目录名称。所以你的分区表只有2个真正的列,你必须用你的SELECT只输入2列。 –

+3

另一方面,如果您使用了*动态分区* - 即没有文字值的'INSERT ... PARTITION(country)' - 那么分区“列”的实际值将不得不作为*在SELECT中的额外*列,在真正的列之后。 –

+0

谢谢一吨Samson Scharfrichter。是的,它工作.....我发布了正确的查询.... –

回答

2

非常感谢参孙Scharfrichter

INSERT OVERWRITE TABLE t1 PARTITION (country='US') 
SELECT no,name from tx where country = 'US'; 
    INSERT INTO TABLE t1 PARTITION (country='IN') 
SELECT no,name from tx where country = 'IN'; 

我查了分区

hive> SHOW PARTITIONS t1; 
OK 
country=IN 
country=US 
Time taken: 0.291 seconds, Fetched: 2 row(s) 
hive> 
+0

我明白了。所以基本上,不要使用*,也不要放置分区列。谢谢! –