2015-08-03 2 views
0

У меня есть данные, которые я сгруппированные и агрегированные, выглядит как this-Pig - Получить Top N и группы отдых в «другой»

Date Country Browser Count 
---- ------- ------- ----- 
2015-07-11,US,Chrome,13 
2015-07-11,US,Opera Mini,1 
2015-07-11,US,Firefox,2 
2015-07-11,US,IE,1 
2015-07-11,US,Safari,1 
... 
2015-07-11,UK,Chrome Mobile,1026 
2015-07-11,UK,IE,455 
2015-07-11,UK,Mobile Safari,4782 
2015-07-11,UK,Mobile Firefox,40 
... 
2015-07-11,DE,Android browser,1316 
2015-07-11,DE,Opera Mini,3 
2015-07-11,DE,PS4 Web browser,11 

Я хочу, чтобы получить верхний п браузеры (по количеству) в страну , и хотите объединить остальные в разделе «Другое». Я посмотрел на встроенную функцию TOP Pig, но как бы я сделал группировку в другом. В результате я хочу, например, (n = 2) ->

2015-07-11,US,Chrome,13 
2015-07-11,US,Firefox,2 
2015-07-11,US,Other,3 

Что было бы лучшим способом?

+0

Свинья не SQL, поэтому я, что удаление тега. –

ответ

1

Ok .. Это требование хороший ..

Я просто используя свой вклад в НАГРУЗКИ утверждении Свиньи сценария.

Вход:

2015-07-11,US,Chrome,13 
2015-07-11,US,Opera Mini,1 
2015-07-11,US,Firefox,2 
2015-07-11,US,IE,1 
2015-07-11,US,Safari,1 
2015-07-11,UK,Chrome Mobile,1026 
2015-07-11,UK,IE,455 
2015-07-11,UK,Mobile Safari,4782 
2015-07-11,UK,Mobile Firefox,40 
2015-07-11,DE,Android browser,1316 
2015-07-11,DE,Opera Mini,3 
2015-07-11,DE,PS4 Web browser,11 
2015-07-11,US,Chrome,13 
2015-07-11,US,Firefox,2 
2015-07-11,US,Other,3 

Ниже кодирование для этого.

Вы можете передать значение для n paramater для скрипта свиньи, в настоящее время я установил значение 2 для n в самой инструкции LIMIT (i.e n = 2).

На самом деле я жестко закодирован n = 2 в этом нижеприведенном коде.

records  = LOAD '/user/cloudera/inputfiles/entries.txt' USING PigStorage(',') as (dt:chararray,country:chararray,browser:chararray,count:int); 

records_each = FOREACH(GROUP records BY (dt,country,browser)) GENERATE flatten(group) AS (dt,country,browser), MAX(records.count) as counts; 

records_grp_order = ORDER records_each BY dt ASC , country ASC , counts DESC; 

records_grp  = GROUP records_grp_order BY (dt, country); 

rec_each = FOREACH records_grp { 

       top_2_recs = LIMIT records_grp_order 2; 
       generate MAX(top_2_recs.dt) AS temp_dt, MAX(top_2_recs.country) AS temp_country, flatten(top_2_recs.browser) AS temp_browser; 

      }; 
rec_join = JOIN records_each BY (dt,country,browser) left outer , rec_each BY (temp_dt,temp_country,temp_browser); 

rec_join_each = FOREACH rec_join generate dt,country, (temp_browser is not null ? browser : 'OTHERS') AS browser, counts AS counts; 

rec_final_grp = GROUP rec_join_each BY (dt,country,browser); 

final_output = FOREACH rec_final_grp generate flatten(group) AS (dt,country,browser), SUM(rec_join_each.counts) AS total_counts; 

sorted_output = ORDER final_output BY dt ASC , country ASC, total_counts DESC; 

dump sorted_output; 

выход

(2015-07-11,DE,Android browser,1316) 
(2015-07-11,DE,PS4 Web browser,11) 
(2015-07-11,DE,OTHERS,3) 
(2015-07-11,UK,Mobile Safari,4782) 
(2015-07-11,UK,Chrome Mobile,1026) 
(2015-07-11,UK,OTHERS,495) 
(2015-07-11,US,Chrome,13) 
(2015-07-11,US,OTHERS,3) 
(2015-07-11,US,Firefox,2) 
+0

Я попробую это, спасибо! –

Смежные вопросы