2013-12-04 2 views
0

Если у меня есть мешок, как так:Pig запросы - Выбор целого мешка

({(11983070,39010451,1139539437),(11983070,53425518,11000)}) 

Я хочу, чтобы выбрать весь пакет, который имеет MAX последнее значение ($ 2), но могу получить только значение MAX на своем собственном с каждой сумкой.

Я хотел бы выход быть

{(11983070,39010451,1139539437)} 

Но не могу заставить его работать. Есть идеи?

ответ

1

Идея состоит в том, чтобы сначала найти MAX, затем добавить значение MAX в качестве дополнительного столбца и затем отфильтровать все строки, которые не удовлетворяют $ 2 == $ maxValue.

После грубого кода - адаптировано из this раствора

records = LOAD 'input.txt' AS (first:int, second:int, third:int); 
records_group = GROUP records ALL; 
with_max = FOREACH records_group 
     GENERATE 
      FLATTEN(records.(first, second, third)), MAX(records.third) as max_third; 
max_row = FILTER with_max BY records.third == max_third 
1

Хотя вы можете сделать это в чистых свинках, используя UDF должны быть более эффективными. Это также довольно просто:

myudfs.py

#!/usr/bin/python 

@outputschema('Values:{(first:int, second:int, third:int)}') 
def get_max(BAG) 
    v = max(BAG, key=lambda x: x[2]) 

    # Since you want it to return in a bag, v needs to be in a list 
    return [v] 

Pig Script

REGISTER 'myudfs.py' USING jython AS myudfs ; 

-- A is your input 
B = FOREACH A GENERATE myudfs.get_max(my_input_bag) ; 
Смежные вопросы