1
  • 2 つの列 (col1:string、col2:boolean) を持つテーブルがあります。
  • col1 = "aaa" としましょう
  • col1 = "aaa" の場合、col2 の True/False 値が多数あります
  • col1 (aaa) の True 値の割合を計算したい

入力:

aaa T
aaa F
aaa F
bbb T
bbb T
ccc F
ccc F

出力

COL1   TOTAL_ROWS_IN_INPUT_TABLE   PERCENTAGE_TRUE_IN_INPUT_TABLE
aaa     3                          33%
bbb     2                          100%
ccc     2                          0%

PIG (LATIN) を使用してこれを行うにはどうすればよいですか?

4

2 に答える 2

3

Pig 0.10 では、SUM(INPUT.col2) は機能せず、ブール値へのキャストはできません。これは、INPUT.col2 をブール値のバッグとして扱い、バッグがプリミティブ型ではないためです。もう 1 つのことは、col2 の入力データがブール値として指定されている場合、入力のダンプには col2 の値がありませんが、それを chararray として扱うことは問題なく機能します。

Pig は、FOREACH にネストされた演算子を使用して個々のグループを処理する手段を備えているため、このタイプのタスクに適しています。動作するソリューションは次のとおりです。

inpt = load '....' as (col1 : chararray, col2 : chararray);
grp = group inpt by col1; -- creates bags for each value in col1
result = foreach grp {
    total = COUNT(inpt);
    t = filter inpt by col2 == 'T'; --create a bag which contains only T values
    generate flatten(group) as col1, total as  TOTAL_ROWS_IN_INPUT_TABLE, 100*(double)COUNT(t)/(double)total as PERCENTAGE_TRUE_IN_INPUT_TABLE;
};

dump result;

出力:

(aaa,3,33.333333333333336)
(bbb,2,100.0)
(ccc,2,0.0)
于 2012-11-20T23:57:34.123 に答える
0

COUNTで各キーのレコード数を計算するときは、同時に値col1の数をカウントする必要があります。trueこのようにして、すべてが 1 つの MapReduce ジョブで行われます。

grouped = group INPUT by col1
OUTPUT = foreach grouped generate group, COUNT(INPUT), (double)SUM(INPUT.col2)/COUNT(INPUT);

私はレガシー システムで Pig 0.9 を使用しているため、新しいブール型に慣れていません。ブール値を超える可能性がある場合はSUM、それで十分です。foreachそれ以外の場合は、単純な/を使用してブール値を 1 と 0 に変換する必要がありますgenerate

于 2012-11-20T19:34:04.237 に答える