2015-04-21 1 views
0

Цель: Использование функций Строковые на сплющенные данных chararrayИспользование функций Строковые на уплощенных данных chararray

Вход: test.txt

file_id  file_name  created_time   accesssed_by 
    1   a1    1      user1 
    1   a2    2      user1 
    2   b1    3      user1 
    3   c1    4      user1 

Pig Сценарий:

A = LOAD 'usertest.txt' USING PigStorage('\t') AS (file_id:long, file_name:chararray, created_time:long,accessed_by:chararray); 
    B = GROUP A BY file_id; 
    C = FOREACH B { 
    sorted = ORDER A BY created_time DESC; 
    user = A.accessed_by; 
    uniq_user = DISTINCT user; 
    last = LIMIT sorted 1; 
    GENERATE UPPER(FLATTEN(last.file_name)) AS file_name, COUNT(uniq_user) AS access_count; 
}; 

Пытается использовать любую из строковых манипуляций функции поверх сланцевого типа данных chararray приводят к следующей ОШИБКЕ.

ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200: <line 185, column 22> mismatched input 'FLATTEN' expecting RIGHT_PAREN 

Без использования функции манипуляции строкой поверх FLATTEN будут получены требуемые данные.

(a2,1) 
(b1,1) 
(c1,1) 

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

Идя дальше, мы можем достичь нашей цели, можем ли мы избежать этого и сделать то же самое раньше.

D = FOREACH C GENERATE UPPER(file_name) AS file_name, access_count; 

Выход:

(A2,1) 
(B1,1) 
(C1,1) 

Update:

на основе входов @Balduz конвертированы мешок в строку с помощью функции Eval BagToString и был в состоянии достичь нашей цели.

C = FOREACH B { 
     sorted = ORDER A BY created_time DESC; 
     user = A.accessed_by; 
     uniq_user = DISTINCT user; 
     last = LIMIT sorted 1; 
     GENERATE UPPER(BagToString(last.file_name)) AS file_name, COUNT(uniq_user) AS access_count; 
     }; 

ответ

2

UPPER функция принимает строку, но так как file_name содержит мешок, когда вы распрямите его вы передаете список строк функции, следовательно, ошибки. Если вы действительно хотите избежать этого дополнительного foreach, вам нужно будет написать пользовательский UDF, который будет делать то же самое, что и UPPER, но возьмет сумку в качестве входных данных. Затем вам нужно будет сделать то же самое вы делаете, но называя UPPER первым и уплощение после этого:

GENERATE FLATTEN(MyUpperForBags(last.file_name)); 
+0

Благодаря @Balduz, основываясь на ваших входов: конвертированы мешок в строку с помощью функции BagToString Eval и был в состоянии достигнуть нашего задача. –

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