私は豚に慣れていないので、入力を解析して使用できる形式にするのに問題があります。入力ファイルには、次のように固定フィールドと KV ペアの両方を持つ行が含まれています。
FF1|FF2|FF3|FF4|KVP1|KVP2|...|KVPn
ここでの私の目標は、KV ペアごとに固有の固定フィールドの組み合わせの数を数えることです。したがって、次の入力行を検討してください。
1|2|3|4|key1=value1|key2=value2
2|3|4|5|key1=value7|key2=value2|key3=value3
完了したら、次の結果を生成できるようにしたいと思います (この時点では、出力形式は重要ではありません。結果をどのようにしたいかを示しているだけです)。
key1=value1 : 1
key1=value7 : 1
key2=value2 : 2
key3=value3 : 1
固定フィールドをグループ化し、KV ペアのバッグを平らにして外積を生成することで、これを行うことができるようです。
私はこれを次のようなもので読み込もうとしました:
data = load 'myfile' using PigStorage('|');
A = foreach data generate $0 as ff1:chararray, $1 as ff2:long, $2 as ff3:chararray, $3 as ff4:chararray, TOBAG($4..) as kvpairs:bag{kvpair:tuple()};
B = foreach A { sorted = order A by ff2; lim = limit sorted 1; generate group.ff1, group.ff4, flatten( lim.kvpairs ); };
C = filter B by ff3 matches 'somevalue';
D = foreach C generate ff1, ff4, flatten( kvpairs ) as kvpair;
E = group D by (ff1, ff4, kvpair);
F = foreach E generate group, COUNT(E);
これにより、次のようなスキーマを持つレコードが生成されます。
A: {date: long,hms: long,id: long,ff1: chararray,ff2: long,ff3: chararray,ff4: chararray,kvpairs: {kvpair: (NULL)}}
これにより、必要なスキーマが得られますが、解決できないように見える問題がいくつかあります。
- .. で TOBAG を使用すると、kvpair にスキーマを適用できないため、kvpair でフィルタリングすることはできません。また、これをどの時点でもキャストできないようです。したがって、すべてかゼロかのクエリです。 .
- ステートメント「C」のフィルターは、使用する値に関係なく、「.*」や「.+」などを使用してもデータを返さないようです。これがスキーマがないためなのか、それとも実際に豚のバグなのかはわかりません。ステートメント B からいくつかのデータをダンプすると、それらの式に一致するデータが確実に表示されます。
そこで、次を使用してデータをロードすることで、問題に別のアプローチを試みました。
data = load 'myfile' using PigStorage('\n') as (line:chararray);
init_parse = foreach data generate FLATTEN( STRSPLIT( line, '\\|', 4 ) ) as (ff1:chararray, ff2:chararray, ff3:chararray, ff4:chararray, kvpairsStr:chararray);
A = foreach mc_bk_data generate ff1, ff2, ff3, ff4, TOBAG( STRSPLIT( kvpairsStr, '\\|', 500 ) ) as kvpairs:bag{t:(kvpair:chararray)};
ここでの問題は、TOBAG( STRSPLIT( ... ) ) が 1 つのタプルのバッグになり、各 kvpairs がそのタプルのフィールドになることです。個々の kvpairs を 1 つのフィールドのタプルとしてバッグに格納する必要があるため、バッグをフラット化すると、バッグと関心のあるグループの外積が得られます。
私はこの問題に取り組む他の方法にもオープンですが、複数のフィールドのタプルをタプルのバッグに変換する良い方法を見つけることができます。各タプルにはそれぞれ 1 つのフィールドがあります。
Apache Pig バージョン 0.11.1.1.3.0.0-107 を使用しています
前もって感謝します。