2014-01-07 4 views
0

Я пытаюсь преобразовать ниже заявление улей на Свиньи:Convesion от улья к PigLatin

max(substr(case when url like 'http:%' then '' else url end,1,50)) 

Мое заявление свинью за выше:

url_group = GROUP data by (uid); 
max_substr_url= FOREACH url_group generate SUBSTRING(MAX(((Coalesce(data.url) matches '.*http:%.*') ? '' : Coalesce(data.url))), 0, 49); 

Для некоторых из данных, URL-адрес может быть нулевым. Поэтому я написал свиной UDF под названием Coalesce (String), который возвращает пустую строку, если данные являются либо пустыми, либо пустыми. Если данные не являются нулевыми или не пустыми, возвращается строка.

Вышеуказанный свиноматок дает мне много неприятностей и пробовал n разных вариантов/способов, но ничего не работало. У кого-нибудь есть идеи о том, как это реализовать? Пожалуйста, помогите мне.

Заранее спасибо

+2

"много проблем", "ничего не получалось" - быть более конкретным –

+0

Pig использует Java регулярных выражений для 'matches', так'% 'не нужно в' * HTTP:% * '... Кроме того, почему вы поменяли MAX и подстроку свинья? Это должно быть 'MAX (SUBSTRING ...' –

+0

Ну, я попробовал много способов заставить свой оператор Pig работать, но еще не успел. – user3167832

ответ

0

Вы будете хотеть использовать nested FOREACH, так что вы можете сделать преобразование подстроки на каждый кортеже в data мешке возьмите MAX преобразованную сумку.

A = GROUP data by (uid); 
B = FOREACH url_group { 
    -- MAX needs a one column bag 
    transformed = FOREACH data 
        GENERATE SUBSTRING((Coalesce(url) matches '.*http:.*' ? '' : Coalesce(url)), 0, 49); 
    GENERATE group AS uid, MAX(transformed) ; 
} 
+0

Большое спасибо за ответ и получил его работу. – user3167832

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