Проблема Pig Load с несколькими разделителями - PullRequest
1 голос
/ 14 сентября 2011

У меня есть несколько строк журнала данных, таких как

Sep 10 12:00:01 10.100.2.28 t: |US,en,5,7350,100,0.076241,0.105342,-1,0,1,5,2,14,,,0,5134,7f378ecef7,fec81ebe-468a-4ac7-b472-8bd1ee88bfc2

Sep 10 12:00:01 10.100.2.28 t: |US,en,3,22427,100,0.05816,0.04018,-1,0,1,15,15,0,24383,cyclops.untd.com/,0,2796,2c5de71073,4858b748-121a-4f60-8087-97a8527d57c6

Sep 10 12:00:01 10.100.2.28 t: |us,en,6,16839,100,-1,-1,-1,17,1,0,-1,0,13819,d.tradex.openx.com/,0,-1,,4f805e3b-86b7-4dee-ae68-24e726cde954

Нет, поскольку очевидно, что есть два разделителя (запятая и пробел). При использовании функции PigStorage я думаю, что могу использовать только одну из них.... Это оставляет меня с chararray другой строки с другим разделителем (пробел или запятая).

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

Монахи, любая помощь будет принята с благодарностью ...

Tanuj

Ответы [ 3 ]

2 голосов
/ 15 сентября 2011

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

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

1 голос
/ 17 апреля 2013

Самое простое решение, о котором я могу подумать, - это использовать встроенный загрузчик PigStorage для одного из двух разделителей, а затем STRSPLIT для получения другого.

Пример (при условии, что есть 19 полей, разделенных запятыми, посколькувыглядело как):

A = LOAD 'myData' USING PigStorage(' ') AS
    (date:chararray,restOfCommaDelimitedFields:chararray);
B = FOREACH A GENERATE date, FLATTEN(STRSPLIT(restOfCommaDelimitedFields,19)) AS
    (country,language,field3,field4...etc);

Обратите внимание, что это сломалось бы, если бы между полями, разделенными запятыми, были пробелы.

0 голосов
/ 12 сентября 2013

напишите свой UDF, это будет лучший способ решить вашу проблему

...