2013-07-08 47 views
1

我有一个表在蜂巢如下,计数和组通过在蜂房

table1 

Cola | Colb | Colc | Cold | 
--------------------------------- 
...etc 
efo18 691 123 5692         
efo18 691 345 5657 
...etc 
fsx31 950 291 23456               
fsx31 950 404 23456               
fsx31 950 343 23456               
fsx31 950 182 23456               
fsx31 950 120 45042               
fsx31 950 161 23456 
....etc 
klz57 490 121 3330               
klz57 490 113 3330               
klz57 490 308 3330               
klz57 490 411 3330               
klz57 490 161 3330               
klz57 386 108 3330               
klz57 490 113 3330               
klz57 490 125 3330               
klz57 490 165 3330               
klz57 490 166 3330 
...etc 
--------------------------------- 

我想另一个表从table1数据与那些具有一组 和内,那些Cold 相同的值具有相同的Colb以具有子组 并且在该子组内,那些具有相同值的Cola属于组。 换句话说,Cola,Colb,Cold的每个唯一组合成为一行。并且重复行被总结。

insert into table table2(Col1 string,Col2 string,Col3 string,Count int) select cola,colb,cold,count(*) from table1 group by cold,colb,cola;

我预计,

Col1 | Col2 | Col3  | Count | 
------------------------------------- 
efo18 691  5692   1 
efo18 691  5657   1 
fsx31 950  23456  5 <-----1 
fsx31 950  45042  1 <-----1 
klz57 490  1234   9 <-----2 
klz57 386  1234   1 <-----2 
-------------------------------------- 

我得到这个,

table2 

Col1 | Col2 | Col3  | Count | 
------------------------------------- 
efo18 691  5692   1 
efo18 691  5657   1 
fsx31 950  23456  4 <-----1 
fsx31 950  25456  1 <-----1 
fsx31 950  45042  1 <-----1 
klz57 490  1234   8 <-----2 
klz57 386  1234   1 <-----2 
klz57 490  1234   1 <-----2 
-------------------------------------- 

我不明白的是我通过Cold做一个组,然后在Colb其次通过Cola,然后 为什么Count标记行(< ---- 1),对于来自Cola的值,是在不同的行中,即使所有内容都属于同一组? Colc对于这两行是不同的,但是我没有使用它来分组sp,这两行如何不同呢? 同样对于标记为(< ---- 2)的行,这里有什么问题。

更新:

Binary01,我尝试了,你给

hive> select * from xyz; 
OK 
x  y  z  zz 
xxx  111  222  123 NULL NULL NULL 
xxx  111  222  123 NULL NULL NULL 
xxx  101  222  123 NULL NULL NULL 
xux  111  422  123 NULL NULL NULL 
xxx  111  522  323 NULL NULL NULL 
xyx  111  622  123 NULL NULL NULL 
xxx  115  322  123 NULL NULL NULL 
xxx  111  122  123 NULL NULL NULL 
xxx  111  223  123 NULL NULL NULL 
xxy  111  212  143 NULL NULL NULL 
xxx  117  222  123 NULL NULL NULL 

什么是在那里做这些NULL值的例子吗?我有复制粘贴你的例子一行一行。即使在创建表的,

create table xyz(x string ,y string, z string , zz string) 
row format delimited fields terminated by ','; 

,并最终查询给人,

hive> select * from xyztemp; 
OK 
xux  111  422  123 NULL NULL 1 
xxx  101  222  123 NULL NULL 1 
xxx  111  122  123 NULL NULL 1 
xxx  111  222  123 NULL NULL 2 
xxx  111  223  123 NULL NULL 1 
xxx  111  522  323 NULL NULL 1 
xxx  115  322  123 NULL NULL 1 
xxx  117  222  123 NULL NULL 1 
xxy  111  212  143 NULL NULL 1 
xyx  111  622  123 NULL NULL 1 

回答

3

你一定错过了一些东西。我尝试使用与您的表类似的以下数据,并根据您的预期检查输出是否完美。

hive>set hive.cli.print.header=true; 
hive> load data local inpath '/home/brdev/sudeep/testdata.txt' into table xyz; 
hive> create table xyz(x string ,y string, z string , zz string) row format delimited fields terminated by ','; 
hive> select * from xyz; 
OK 
x  y  z  zz 
xxx  111  222  123 
xxx  111  222  123 
xxx  101  222  123 
xux  111  422  123 
xxx  111  522  323 
xyx  111  622  123 
xxx  115  322  123 
xxx  111  122  123 
xxx  111  223  123 
xxy  111  212  143 
xxx  117  222  123 

hive>create table xyztemp (aa string,bb string,cc string , dd int); 
hive>insert into table xyztemp select x,y,zz,count(*) from xyz group by zz,y,x; 
hive> select * from xyztemp; 
OK 
aa  bb  cc  dd 
xxx  101  123  1 
xux  111  123  1 
xxx  111  123  4 
xyx  111  123  1 
xxx  115  123  1 
xxx  117  123  1 
xxy  111  143  1 
xxx  111  323  1 

我猜上面是你正在寻找的预期输出。

+0

感谢您的回复,请检查我的更新。我的蜂巢有什么不对吗? (一些设置也许?) –

+0

嗨SuvP我以一个逗号分隔的文件作为输入。所以你可以在一个文件的输入作为逗号分隔,然后尝试加载到表中。 – Binary01

+0

Binary01我也用逗号分隔的列表。检查我的浏览器(localhost:50075)是否有'xyztemp'显示'xux 111 422 123 \ N \ N1'。我想这与我的输入文件有关。我在每行之后使用Enter键。这是问题吗?我有一种感觉是存在拖尾空间的问题。我如何解决这个问题? –

1

不确定这是这里的问题,但在列值在某些行中具有前导或尾随空格的情况下,我看到了类似的结果。 Hive不会考虑'fsx31''fsx31 '(注意后者的尾部空间)是相同的值,因此在分组时会给它们各自的行。

当您使用TRIM删除前导空格和尾随空格时,会发生什么情况?

INSERT INTO table table2(Col1 STRING, Col2 STRING, Col3 STRING, Count INT) 
SELECT cola, colb, cold, count(*) 
FROM (
    SELECT 
     TRIM(cola) AS cola, 
     TRIM(colb) AS colb, 
     TRIM(colb) AS colb 
    FROM table1 
    ) 
GROUP BY cold, colb, cola; 

(使用子查询修剪和别名列并非绝对必要,但我希望它有助于澄清的意图是什么。)

希望有帮助。