Преобразование вывода из Flatten и Strsplit в Pig

Я пытаюсь проанализировать экстракт журнала с несколькими разделителями с примерами данных, как показано ниже, используя свинью

CEF:0|NetScreen|Firewall/VPN||traffic:1|Permit|Low| eventId=5                  
msg=start_time\="2015-05-20 09:41:38" duration\=0 policy_id\=64

Мой код выглядит следующим образом:

A = LOAD '/user/cef.csv' USING PigStorage(' ') as  
(a:chararray,b:chararray,c:chararray,d:chararray,e:chararray,f:chararray,g:chararray);
B = FOREACH A GENERATE STRSPLIT(SUBSTRING(a, LAST_INDEX_OF(a,'|')+1,   (int)SIZE(a)),'=',2),STRSPLIT(b,'=',2),STRSPLIT(c,'=',2),STRSPLIT(d,'=',2),STRSP     LIT(e,'=',2),STRSPLIT(f,'=',2),STRSPLIT(g,'=',2);
C = FOREACH B GENERATE FLATTEN($0), FLATTEN($1),        FLATTEN($2),FLATTEN($3),FLATTEN($4),FLATTEN($5);
D = FOREACH C GENERATE $2,flatten(STRSPLIT($4,'"',2)),flatten(STRSPLIT($5,'"',2)),$7,$9;
E = FOREACH D GENERATE (int)$0,(chararray)$2,(chararray)$3,(int)$5,(int)$6 as (a:int,b:chararray,c:chararray,D:int,E:int);

Теперь, когда я сбрасываю E, я получаю ошибку

grunt> 2015-05-25 04:06:48,092 [main] ERROR org.apache.pig.tools.grunt.Grunt   

- ERROR 1031: Incompatable schema: left is  

"a:int,b:chararray,c:chararray,D:int,E:int", right is ":int"

Я пытаюсь преобразовать вывод моих операций flatten и strsplit в chararray и int.

Подскажите пожалуйста можно ли это сделать

Спасибо вам за помощь!


person san71    schedule 25.05.2015    source источник
comment
Этот кастинг работает? Я так не думаю... типы данных   -  person heap    schedule 11.01.2016


Ответы (1)


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

Сделай это так:

E = FOREACH D GENERATE (int)$0 as a:int,(chararray)$2 as b,(chararray)$3 as c,(int)$5 as d,(int)$6 as e;

Однако вы приводите 09:41:38" к int, поэтому после его изменения вы получите еще одну ошибку. Вам нужно еще раз проверить, как вы разбиваете данные.

По моему скромному мнению, вы должны попытаться разделить файлы по их разделителю перед их обработкой в ​​Pig, а затем загрузить их с их разделителем и выполнить union. Если ваши данные слишком велики, забудьте об этой идее... Но ваш код станет слишком беспорядочным, если у вас будет несколько разделителей в одном файле.

person Balduz    schedule 25.05.2015