4

This wasn't a problem in 0.9.2, but in 0.10, when I try to access a key in a map that has a dollar sign in it, I get hammered with errors that I haven't defined the variable. Specifically:

blah = FOREACH meh GENERATE source, json_post_id#'$id' AS post_id;

returns

Undefined parameter : id

That's fine and makes sense, but when I amend it to:

blah = FOREACH meh GENERATE source, json_post_id#'\$id' AS post_id;

I get:

Unexpected character '$'

Ideas?

[Edit] Forgot to mention: have tried with 2 backslashes and 3 backslashes as well. No dice. [/Edit]

4

1 に答える 1

4
  1. Mail Archive Postingへの応答に基づくと、「Gruntシェルを使用してスクリプトとして実行すると動作が異なる」ようです。

    入力ファイル

    cheolsoo@localhost:~/workspace/pig-svn $cat 1.txt $id,a
    

    グラントシェル

    $バックスラッシュなしで動作します:

    grunt> A = LOAD '1.txt' USING PigStorage(',') AS (k:chararray,
    v:chararray); grunt> B = FOREACH A GENERATE TOMAP(k, v) AS M; grunt> C
    = FOREACH B GENERATE M#'$id'; grunt> DUMP C; (a)
    

    脚本

    $単一の円記号を使用すると、次のように機能します。

    cheolsoo@localhost:~/workspace/pig-svn $cat test.pig A = LOAD '1.txt' 
    USING PigStorage(',') AS (k:chararray, v:chararray); B = FOREACH A
    GENERATE TOMAP(k, v) AS M; C = FOREACH B GENERATE M#'\$id'; DUMP C;
    
    cheolsoo@localhost:~/workspace/pig-svn $./bin/pig -x local test.pig
    (a)
    
  2. また、分割文字列(STRSPLIT)のPig問題から、次のいずれかを試しましたか。

    • 文字を正しくエスケープしますu0024。一重引用符または二重引用符を使用して一重引用符をテストし、それが違いを生むかどうかを確認します。この答えは、一重引用符があなたが持っている違いを生むことを示していますが、言及する価値があります。

    • または、関連していても、ループをブロックに分割します

      blah = FOREACH meh {
          GENERATE source, json_post_id#'$id' AS post_id; 
      }
      
  3. を連結しているようですid。を使用することを想定していないことを確認してくださいCONCAT()http://pig.apache.org/docs/r0.10.0/func.html#concat

  4. ドキュメントによるとClass PigStorage(Pig 0.10.0 API)

    文字区切り文字を使用して入力行をフィールドに解析するロード関数。デフォルトの区切り文字はタブです。任意の文字をリテラル( "a")、既知のエスケープ文字( "\ t")、またはdecまたはhex値( "\ u001"、 "\ x0A")として指定できます。

于 2013-01-21T12:14:48.687 に答える