次のタプル H1 があり、その $0 をタプルに strsplit したいのですが、常にエラー メッセージが表示されます。
DUMP H1:
(item32;item31;,1)
m = FOREACH H1 GENERATE STRSPLIT($0, ";", 50);
エラー 1000: 解析中にエラーが発生しました。行 1、列 40 に字句エラーがあります。検出: after : "\";"
スクリプトの何が問題なのか知っている人はいますか?
次のタプル H1 があり、その $0 をタプルに strsplit したいのですが、常にエラー メッセージが表示されます。
DUMP H1:
(item32;item31;,1)
m = FOREACH H1 GENERATE STRSPLIT($0, ";", 50);
エラー 1000: 解析中にエラーが発生しました。行 1、列 40 に字句エラーがあります。検出: after : "\";"
スクリプトの何が問題なのか知っている人はいますか?
このセミコロンに遭遇すると、pig 解析ルーチンにエスケープの問題があります。
セミコロンに 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))
セミコロンでの STRSPLIT は注意が必要です。ブロックの中に入れて動作させました。
raw = LOAD 'cname.txt' as (name,cname_string:chararray);
xx = FOREACH raw {
cname_split = STRSPLIT(cname_string,';');
GENERATE cname_split;
}
面白いことに、これが私が最初に STRSPLIT() コマンドを実装した方法です。セミコロンで分割しようとした後でのみ、同じ問題に遭遇しました。