3

我在蜂巢中有一张桌子,如下所示,

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具有相同值的数据,在该数据表中,那些具有相同值的数据具有一个子组,在该子组内,那些具有相同值的数据属于一个组。换句话说,每一个唯一的组合就是一行。而重复的行被求和。ColdColbColaCola,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然后ColbCola,那么为什么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
4

2 回答 2

4

你一定错过了什么。我尝试使用与您的表格类似的以下数据并检查输出是否完全符合您的预期。

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

我猜以上是您正在寻找的预期输出。

于 2013-07-08T11:28:46.507 回答
1

不确定这是不是这里的问题,但是在列值在某些行中具有前导或尾随空格的情况下,我看到了类似的结果。Hive 不会认为'fsx31'and '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;

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

希望有帮助。

于 2013-07-08T14:38:02.960 回答