2015-09-18 1 views
1

У меня есть ниже данные:Как использовать array_agg() агрегатную функцию в свинью или улей

================================================================ 
session_id      screen_name screen_launch_time 
================================================================ 
990004916946605-1404157897784 screen1  1404157898275 
990004916946605-1404157897784 screen2  1404157898337 
990004947764274-1435162269418 screen1  1435162274044 
990004947764274-1435162269418 screen3  1435162274081 

Я хотел бы использовать array_agg функцию, чтобы получить мои данные в приведенной ниже форме:

========================================================= 
session_id      screen_flow   count 
========================================================= 
990004916946605-1404157897784 screen1->screen2 1 
990004947764274-1435162269418 screen1->screen3 1 

Кто-нибудь пытался написать сценарий UDAF или python для реализации логики, используемой в функции array_agg?

Пожалуйста, поделитесь своими мыслями.

+0

улей имеет встроенный 'collect_set() и' collect_list() ', который объединяет элементы в массиве. Здесь есть udf, который делает тот же https://github.com/klout/brickhouse/tree/master/src/main/java/brickhouse/udf/collect – gobrewers14

+0

Привет, он дает мне эту ошибку: – explorethis

+0

FAILED: ParseException line 1: 0 символ '' здесь не поддерживается – explorethis

ответ

3

Только группа по session_id, concat screen_name и подсчет записей в группе. Если вы не хотите строить банку brickhouse, вы можете использовать collect_list() вместо collect() (но я не рекомендую).

Запрос:

add jar /path/to/jars/brickhouse-0.7.1.jar; 
create temporary function collect as "brickhouse.udf.collect.CollectUDAF"; 

select session_id, screen_flow 
    , count(*) count 
from (
    select session_id 
    , concat_ws('->', collect(screen_name)) screen_flow 
    from db.table 
    group by session_id) x 
group by session_id, screen_flow 

Выход:

990004916946605-1404157897784 screen1->screen2 1 
990004947764274-1435162269418 screen1->screen3 1 
+0

Хороший GoBrewers .. Мне также нужно сделать еще 2 вещи: 1. удалить дубликаты экранов (если есть) после группировки по идентификатору сеанса 2. ранжировать их на основе максимальных значений. Можете ли вы помочь в этом? – explorethis

+1

Если мой ответ решает вашу оригинальную проблему, отметьте как правильно, а затем, если у вас есть дополнительные вопросы, задайте новый вопрос, и я обязательно помогу, если смогу. – gobrewers14

+0

hi GoBrewers, вот ссылка на новый вопрос - http://stackoverflow.com/questions/32681157/how-to-find-the-pathing-flow-and-rank-them-using-pig-or-hive – explorethis

1

Вход: -

990004916946605-1404157897784,screen1,1404157898275 
990004916946605-1404157897784,screen2,1404157898337 
990004947764274-1435162269418,screen1,1435162274044 
990004947764274-1435162269418,screen3,1435162274081 

Ниже ответ на Pig Style ..

records = LOAD '/user/user/inputfiles/session_id.txt' USING PigStorage(',') AS (session_id:chararray,screen_name:chararray,screnn_launch_time:chararray); 

rec_grped = GROUP records BY session_id; 

rec_each = FOREACH rec_grped 
        { 
         rec_inner_each = FOREACH records GENERATE screen_name; 

         GENERATE group as session_id, REPLACE(BagToString(rec_inner_each),'_','-->') as screen_flow, 1 as cnt; 
}; 

dump rec_each; 

выход: -

990004916946605-1404157897784 screen1-->screen2 1 
990004947764274-1435162269418 screen1-->screen3 1 
+0

Спасибо Surender. Неплохо. Мне также нужно сделать еще 2 вещи: 1. удалить дубликаты экранов (если есть) после группировки по идентификатору сеанса 2. ранжировать их на основе максимального количества. Можете ли вы помочь в этом? – explorethis

+0

Хорошо. Для дублирования сценария просто укажите мне ввод и ожидаемый результат. Также было бы хорошо, если бы вы задали его как отдельный вопрос. Спасибо –

+0

Hi Surender, я разместил его как отдельный вопрос - – explorethis