2017-02-07 5 views
2

Я пытаюсь написать сценарий в PIG, и мне нужно сделать набор данных, содержащий идентификатор пользователя, дату, код страны и другие атрибуты ... мой разыскиваемый результат в группе по идентификатору пользователя и дату, и для каждой группы, как, что - для конкатенации кодов стран в той же области ...Объединить разные записи в скрипте PIG

Например:

user_id | date | country_code 
1  2017-01-01  US 
1  2017-01-01  UK 
1  2017-01-02  FR 
2  2017-01-02  RU 
2  2017-01-03  DE 
2  2017-01-03  AU 

мой хотел вывод:

(1, 2017-01-01, "US,UK") 
(1, 2017-01-02, FR) 
(2, 2017-01-02, RU) 
(2, 2017-01-03, "DE,AU") 

ответ

2

вопрос с совершенно иной формулировкой на самом деле дали this answer по @Hari Шанкар, поскольку вопрос не представляется дубликатом я отправлю ответ здесь непосредственно:

grouped = GROUP table BY userid; 
    X = FOREACH grouped GENERATE group as userid, 
           table.clickcount as clicksbag, 
           table.pagenumber as pagenumberbag; 

Теперь X будет:

{(155,{(2),(3),(1)},{(12),(133),(144)}, 
(156,{(6),(7)},{(1),(5)}} 

Теперь вы должны использовать builtin UDF BagToTuple:

output = FOREACH X GENERATE userid, 
          BagToTuple(clickbag) as clickcounts, 
          BagToTuple(pagenumberbag) as pagenumbers; 

output должен теперь содержать то, что вы хотите. Вы можете объединить шаг вывода в стадии слияния, а также:

output = FOREACH grouped GENERATE group as userid, 
        BagToTuple(table.clickcount) as clickcounts, 
        BagToTuple(table.pagenumber) as pagenumbers; 

1: http://pig.apache.org/docs/r0.11.1/api/org/apache/pig/builtin/BagToTuple.html

+0

Большое спасибо! – Bramat