web-dev-qa-db-ja.com

PIGエイリアス内の行数をカウントする方法

PIGのエイリアスの行数を数えるために、次のようなことをしました。

logs = LOAD 'log'
logs_w_one = foreach logs generate 1 as one;
logs_group = group logs_w_one all;
logs_count = foreach logs_group generate SUM(logs_w_one.one);
dump logs_count;

これは効率が悪いようです。もっと良い方法があれば教えてください!

50
kee

COUNTは豚の一部です マニュアルを参照

LOGS= LOAD 'log';
LOGS_GROUP= GROUP LOGS ALL;
LOG_COUNT = FOREACH LOGS_GROUP GENERATE COUNT(LOGS);
94

Arnon Rotem-Gal-Ozは少し前にすでにこの質問に回答しましたが、この簡潔なバージョンを好む人もいるかもしれません。

LOGS = LOAD 'log';
LOG_COUNT = FOREACH (GROUP LOGS ALL) GENERATE COUNT(LOGS);
29
Jerome Serrano

COUNTを使用して、バッグの最初のアイテムをnullにしないでください。それ以外の場合は、関数COUNT_STARを使用してすべての行をカウントできます。

29
Kevin

基本的なカウントは、他の回答および豚のドキュメントに記載されているとおりに行われます。

logs = LOAD 'log';
all_logs_in_a_bag = GROUP logs ALL;
log_count = FOREACH all_logs_in_a_bag GENERATE COUNT(logs);
dump log_count

豚のビルトインCOUNTを使用する場合でも、1つの減速機を使用するため、カウントは非効率的です。しかし、今日、それを高速化する方法の1つは、カウントしている関係の使用率をRAM.

言い換えれば、リレーションをカウントするとき、実際にはデータ自体を気にしないので、できるだけ少ないRAMを使用します。カウントの最初の繰り返しで正しい軌道に乗っていました脚本。

logs = LOAD 'log'
ones = FOREACH logs GENERATE 1 AS one:int;
counter_group = GROUP ones ALL;
log_count = FOREACH counter_group GENERATE COUNT(ones);
dump log_count

これは、前のスクリプトよりもはるかに大きな関係で機能し、はるかに高速です。これと元のスクリプトの主な違いは、何も合計する必要がないことです。

4
WattsInABox

COUNT_STARを使用

LOGS= LOAD 'log';
LOGS_GROUP= GROUP LOGS ALL;
LOG_COUNT = FOREACH LOGS_GROUP GENERATE COUNT_STAR(LOGS);
2
hello_abhishek

リレーション内のすべての行をカウントすることです(Pig Latinのデータセット)

次の手順に従うと、これは非常に簡単です。

logs = LOAD 'log'; --relation called logs, using PigStorage with tab as field delimiter
logs_grouped = GROUP logs ALL;--gives a relation with one row with logs as a bag
number = FOREACH LOGS_GROUP GENERATE COUNT_STAR(logs);--show me the number

COUNT_STARの代わりにCOUNTを使用するため、最初のフィールドがnullではない行の数だけになるというKevinのポイントが重要だと言わざるを得ません。

また、ジェロームの1行の構文はより簡潔ですが、教訓的であるために、2つに分けてコメントを追加することを好みます。

一般的に私は好む:

numerito = FOREACH (GROUP CARGADOS3 ALL) GENERATE COUNT_STAR(CARGADOS3);

以上

name = GROUP CARGADOS3 ALL
number = FOREACH name GENERATE COUNT_STAR(CARGADOS3);
0
Javier Bañez

これは最適化されたバージョンです。上記のすべての解決策では、カウントするときにブタが完全なタプルを読み書きする必要があります。以下のこのスクリプトは「1」

DEFINE row_count(inBag, name) RETURNS result {
    X = FOREACH $inBag generate 1;
    $result = FOREACH (GROUP X ALL PARALLEL 1) GENERATE '$name', COUNT(X);
};

のような使用

xxx = row_count(rows, 'rows_count');
0
Igor Katkov