2011-04-14 51 views
11

我有以下的元组H1,要strsplit其$ 0改成元组,但总是得到错误信息:猪问题分割字符串(STRSPLIT)

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

了解它,但它很棘手:m = FOREACH H1 GENERATE STRSPLIT($ 0,'\\ u003B',50); – ohana 2011-04-15 05:33:19

+4

你应该为你的问题提供一个答案,然后接受它 – 2011-04-15 17:52:42

回答

4

STRSPLIT在分号上很棘手。我通过把它放在一个块里面来工作。

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

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

有趣的是,这是我最初实现我的STRSPLIT()命令。只有在试图让它在分号上分裂之后,我才遇到同样的问题。

12

猪分析例程遇到这个分号时有一个转义问题。

您可以对分号使用unicode转义序列:\u003B。但是,这也必须斜线转义并放入单引号字符串中。或者,您可以按照Neil的答案,通过多行重写命令。在所有情况下,这必须是单引号字符串。

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))