2015-01-14 3 views
0

У меня есть сценарий свиньи, которая делает группировку и подсчет различных клиентов, как показано нижесвинья одна группа по значению на редуктор

by_customer = GROUP customer BY (start_date, spc); 
    cust_cnt = FOREACH by_customer { 
    cust =  DISTINCT customer.cid; 
    GENERATE FLATTEN(group), COUNT(cust); 
    }; 

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

+0

Вы пытались использовать PARALLEL? – mbaxi

ответ

0

Я исправил эту проблему, выполнив обходной путь, чтобы получить отдельный счет, не выделяя отдельное ключевое слово.

by_customer = GROUP customer BY (cid,start_date,spc); dist_customer = FOREACH by_customer GENERATE group.start_date as start_date,group.spc as spc,1 as cst_cnt; cust = GROUP dist_customer by (start_date,spc); cust_cnt = FOREACH cust GENERATE FLATTEN(group), SUM(dist_customer.cst_cnt);

Это работало отлично. Не знаете, почему отличительные признаки не работают.

Спасибо за помощь.

0

Вы можете использовать параллельный оператор для группы, чтобы увеличить количество редукторов. Если ваши данные действительно, действительно искажены, это не поможет, хотя, поскольку один редуктор все же может получить слишком много данных. Объяснение этого способа облегчения заключается в том, чтобы ввести случайное числовое поле и добавить его к группе.

customer_random = foreach customer generate RANDOM() as seed, start_date, spc, cid, ... 
by_customer = group customer_random by (seed, start_date, spc); 

Очевидно, что это создает различные группы, чем первоначально, так что вы должны принять это во внимание при дальнейшей обработке (различные счетчики, суммы и т.д.). Делает вещи немного сложнее, но лучше распределять данные между редукторами.