11

次のタプル H1 があり、その $0 をタプルに strsplit したいのですが、常にエラー メッセージが表示されます。

DUMP H1:
(item32;item31;,1)

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

エラー 1000: 解析中にエラーが発生しました。行 1、列 40 に字句エラーがあります。検出: after : "\";"

スクリプトの何が問題なのか知っている人はいますか?

4

2 に答える 2

12

このセミコロンに遭遇すると、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))
于 2011-10-21T20:22:05.067 に答える
4

セミコロンでの STRSPLIT は注意が必要です。ブロックの中に入れて動作させました。

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

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

面白いことに、これが私が最初に STRSPLIT() コマンドを実装した方法です。セミコロンで分割しようとした後でのみ、同じ問題に遭遇しました。

于 2011-07-26T15:19:10.183 に答える