2013-07-08 46 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; 

(使用子查詢修剪和別名列並非絕對必要,但我希望它有助於澄清的意圖是什麼。)

希望有幫助。