Проблема свиней с разделенной строкой (STRSPLIT)

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

DUMP H1:
(item32;item31;,1)

m = FOREACH H1 GENERATE STRSPLIT($0, ";", 50);
ERROR 1000: Error during parsing. Lexical error at line 1, column 40.  Encountered: <EOF> after : "\";"

Кто-нибудь знает, что с ним не так? Спасибо!

Ответ 1

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

Вы можете использовать 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))

Ответ 2

STRSPLIT на полуколонии сложнее. Я получил его для работы, поместив его внутри блока.

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

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

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