вопрос strsplit - Свинья - PullRequest
       3

вопрос strsplit - Свинья

11 голосов
/ 15 апреля 2011

У меня есть следующий кортеж H1, и я хочу strsplit его $ 0 в кортеж. Однако я всегда получаю сообщение об ошибке:

DUMP H1:
(item32;item31;,1)

m = FOREACH H1 GENERATE STRSPLIT($0, ";", 50);

ОШИБКА 1000: ошибка при разборе. Лексическая ошибка в строке 1, столбец 40. Обнаружено: после: "\"; "

Кто-нибудь знает, что не так со сценарием?

Ответы [ 2 ]

12 голосов
/ 22 октября 2011

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

Вы можете использовать escape-последовательность Unicode для точки с запятой: \u003B.Однако это также должно быть экранировано и помещено в одну строку в кавычках.Кроме того, вы можете переписать команду в несколько строк, в соответствии с ответом Нила.Во всех случаях это должна быть строка в одинарных кавычках.

H1 = LOAD 'h1.txt' as (splitme:chararray, name);

A1 = FOREACH H1 GENERATE STRSPLIT(splitme,'\\u003B'); -- OK
B1 = FOREACH H1 GENERATE STRSPLIT(splitme,';');       -- ERROR
C1 = FOREACH H1 GENERATE STRSPLIT(splitme,':');       -- OK
D1 = FOREACH H1 {                                     -- OK
    splitup = STRSPLIT( splitme, ';' );
    GENERATE splitup;
}

A2 = FOREACH H1 GENERATE STRSPLIT(splitme,"\\u003B"); -- ERROR
B2 = FOREACH H1 GENERATE STRSPLIT(splitme,";");       -- ERROR
C2 = FOREACH H1 GENERATE STRSPLIT(splitme,":");       -- ERROR
D2 = FOREACH H1 {                                     -- ERROR
    splitup = STRSPLIT( splitme, ";" );
    GENERATE splitup;
}

Dump H1;
(item32;item31;,1)

Dump A1;
((item32,item31))

Dump C1;
((item32;item31;))

Dump D1;
((item32,item31))
4 голосов
/ 26 июля 2011

STRSPLIT на точку с запятой это сложно. Я заставил его работать, положив его внутрь блока.

raw = LOAD 'cname.txt' as (name,cname_string:chararray);

xx = FOREACH raw {
  cname_split = STRSPLIT(cname_string,';');
  GENERATE cname_split;
}

Как ни странно, именно так я и реализовал свою команду STRSPLIT (). Только после попытки разбить его на точку с запятой я столкнулся с той же проблемой.

...