6

フォームの巨大なテキストファイルがあります

データはディレクトリdata/data1.txt、data2.txtなどに保存されます

merchant_id, user_id, amount
1234, 9123, 299.2
1233, 9199, 203.2
 1234, 0124, 230
 and so on..

私がやりたいのは、各商人について、平均金額を見つけることです。

つまり、基本的には、出力をファイルに保存したいと思います。何かのようなもの

 merchant_id, average_amount
  1234, avg_amt_1234 a
  and so on.

標準偏差も計算するにはどうすればよいですか?

そのような基本的な質問をしてすみません。:(どんな助けもいただければ幸いです。:)

4

4 に答える 4

13

Apache PIGは、このようなタスクに適しています。例を参照してください:

inpt = load '~/pig_data/pig_fun/input/group.txt' as (amnt:double, id:chararray,c2:chararray);
grp = group inpt by id;
mean = foreach grp {
    sum = SUM(inpt.amnt);
    count = COUNT(inpt);
    generate group as id, sum/count as mean, sum as sum, count as count;
};

amnt列のデータ型は、SUM関数PIGのどの実装が呼び出すかに影響するため、特に注意してください。

PIGは、SQLでは不可能なことも実行できます。内部結合を使用せずに、各入力行に対して平均を設定できます。これは、標準偏差を使用してzスコアを計算する場合に役立ちます。

 mean = foreach grp {
    sum = SUM(inpt.amnt);
    count = COUNT(inpt);
    generate FLATTEN(inpt), sum/count as mean, sum as sum, count as count;
};

FLATTEN(inpt)がトリックを実行します。これで、グループの平均、合計、およびカウントに貢献した元の金額にアクセスできます。

更新1:

分散と標準偏差の計算

inpt = load '~/pig_data/pig_fun/input/group.txt' as (amnt:double, id:chararray, c2:chararray);
grp = group inpt by id;
mean = foreach grp {
        sum = SUM(inpt.amnt);
        count = COUNT(inpt);
        generate flatten(inpt), sum/count as avg, count as count;
};
tmp = foreach mean {
    dif = (amnt - avg) * (amnt - avg) ;
     generate *, dif as dif;
};
grp = group tmp by id;
standard_tmp = foreach grp generate flatten(tmp), SUM(tmp.dif) as sqr_sum; 
standard = foreach standard_tmp generate *, sqr_sum / count as variance, SQRT(sqr_sum / count) as standard;

2つのジョブを使用します。私はそれを1つで行う方法を理解していません、うーん、それにもっと時間を費やす必要があります。

于 2012-09-27T10:08:35.300 に答える
1

それであなたは何がほしいの?実行中のJavaコードまたは抽象map-reduceプロセスが必要ですか?2番目の場合:

マップステップ:

record -> (merchant_id as key, amount as value)

削減ステップ:

(merchant_id, amount) -> (merchant_id, aggregate the value you want)

削減ステップと同様に、同じキーを持つレコードのストリームが提供され、平均、分散など、できることのほとんどすべてを実行できます。

于 2012-09-26T02:27:52.300 に答える
1

1つのステップで標準偏差を計算できます。式を使用して

var=E(x^2)-(Ex)^2
inpt = load '~/pig_data/pig_fun/input/group.txt' as (amnt:double,  id:chararray, c2:chararray);
grp = group inpt by id;
mean = foreach grp {
    sum = SUM(inpt.amnt);
    sum2 = SUM(inpt.amnt**2);
    count = COUNT(inpt);
    generate flatten(inpt), sum/count as avg, count as count, sum2/count-    (sum/count)**2 as std;
};

それでおしまい!

于 2015-10-01T07:15:24.463 に答える
0

すべての統計(最小、最大、平均、標準偏差)を1つのループで計算しました。FILTER_DATAにはデータセットが含まれています。

    GROUP_SYMBOL_YEAR = GROUP FILTER_DATA BY (SYMBOL, SUBSTRING(TIMESTAMP,0,4));
STATS_ALL = FOREACH GROUP_SYMBOL_YEAR { 
    MINIMUM = MIN(FILTER_DATA.CLOSE);
    MAXIMUM = MAX(FILTER_DATA.CLOSE);
    MEAN = AVG(FILTER_DATA.CLOSE);
    CNT = COUNT(FILTER_DATA.CLOSE);
    CSQ = FOREACH FILTER_DATA GENERATE CLOSE * CLOSE AS (CC:DOUBLE);
    GENERATE group.$0 AS (SYMBOL:CHARARRAY), MINIMUM AS (MIN:DOUBLE), MAXIMUM AS (MAX:DOUBLE), ROUND_TO(MEAN,6) AS (MEAN:DOUBLE), ROUND_TO(SQRT(SUM(CSQ.CC) / (CNT * 1.0) - (MEAN * MEAN)),6) AS (STDDEV:DOUBLE), group.$1 AS (YEAR:INT);
};
于 2020-11-10T09:33:58.303 に答える