Apache Pigを使用して、大きなキー->値のマッピングを作成し、マップで検索して、キーを反復処理したいと思います。ただし、これらのことを行うための構文すら存在しないようです。マニュアル、ウィキ、サンプルコード、エレファントブック、グーグルをチェックし、パーサーソースの解析も試みました。すべての例は、ファイルからマップリテラルをロードします...そしてそれらを使用することはありません。Pigのマップをどのように使用できますか?
まず、2列のCSVファイルをマップに直接ロードする方法はないようです。私が単純なものを持っている場合map.csv
:
1,2
3,4
5,6
そして、私はそれを地図としてロードしようとします:
m = load 'map.csv' using PigStorage(',') as (M: []);
dump m;
空のタプルが3つあります。
()
()
()
そこで、タプルをロードしてからマップを生成しようとします。
m = load 'map.csv' using PigStorage(',') as (key:chararray, val:chararray);
b = foreach m generate [key#val];
ERROR 1000: Error during parsing. Encountered " "[" "[ "" at line 1, column 24.
...
構文の多くのバリエーションも失敗します(例:)generate [$0#$1]
。
OK、それで私は自分の地図をPigの地図リテラル形式に次のように変更しますmap.pig
:
[1#2]
[3#4]
[5#6]
そしてそれをロードします:
m = load 'map.pig' as (M: []);
次に、いくつかのキーをロードして、ルックアップを試してみましょう。
k = load 'keys.csv' as (key);
dump k;
3
5
1
c = foreach k generate m#key; /* Or m[key], or... what? */
ERROR 1000: Error during parsing. Invalid alias: m in {M: map[ ]}
うーん、わかりました。おそらく2つの関係があるため、参加する必要があります。
c = join k by key, m by /* ...um, what? */ $0;
dump c;
ERROR 1068: Using Map as key not supported.
c = join k by key, m by m#key;
dump c;
Error 1000: Error during parsing. Invalid alias: m in {M: map[ ]}
失敗。マップのキー(または値)を参照するにはどうすればよいですか?マップスキーマの構文では、キーと値に名前を付けることさえできないようです(メーリングリストには、タイプを割り当てる方法がないと書かれています)。
最後に、マップですべてのキーを見つけられるようにしたいと思います。
d = foreach m generate ...oh, forget it.
Pigのマップタイプは中途半端ですか?私は何が欠けていますか?