Подсчет и группировка в Hive

У меня есть таблица в улье следующим образом,

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

person Suvarna Pattayil    schedule 08.07.2013    source источник


Ответы (2)


Вы, должно быть, что-то пропустили. Я попытался со следующими данными, похожими на вашу таблицу, и проверил вывод, как вы и ожидали.

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

Я предполагаю, что приведенное выше является ожидаемым результатом, который вы ищете.

person Binary01    schedule 08.07.2013
comment
Спасибо за ответ, проверьте мое обновление. Может быть, что-то не так с моим Hive? (Возможно, какие-то настройки?) - person Suvarna Pattayil; 08.07.2013
comment
Привет SuvP Я беру файл, разделенный запятыми, в качестве входных данных. Таким образом, вы можете ввести входные данные в файл как разделенные запятыми, а затем попытаться загрузить в таблицу. - person Binary01; 08.07.2013
comment
Binary01 Я тоже использовал список, разделенный запятыми. Проверка в моем браузере (localhost: 50075) на xyztemp показывает xux 111 422 123\N\N1. Я предполагаю, что это как-то связано с моим входным файлом. Я использовал клавишу Enter после каждой строки. Это проблема? У меня такое ощущение, что есть проблема с конечными пробелами. Как мне это решить? - person Suvarna Pattayil; 08.07.2013
comment
Я думаю, вы можете создать его самостоятельно, заглянув во входной файл. Я предполагаю, что прямое копирование из браузера вызывает проблему. - person Binary01; 08.07.2013

Не уверен, что здесь проблема, но я видел аналогичные результаты в случаях, когда значения столбца имели начальные или конечные пробелы в некоторых строках. 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;

(Использование подзапроса для обрезки и псевдонимов столбцов не является строго обязательным, но я надеюсь, что это поможет прояснить, в чем заключается цель.)

Надеюсь, это поможет.

person Lukas Vermeer    schedule 08.07.2013