Apache-pig-diff

提供:Dev Guides
移動先:案内検索

Apache Pig-DIFF()

Pig Latinの* DIFF()*関数は、タプル内の2つのバッグ(フィールド)を比較するために使用されます。 タプルの2つのフィールドを入力として受け取り、それらを照合します。 それらが一致する場合、空のバッグを返します。 一致しない場合、1つのフィールド(バッグ)に存在し、他のフィールド(バッグ)にない要素を見つけ、それらの要素をバッグにラップして返します。

構文

以下に、* DIFF()*関数の構文を示します。

grunt> DIFF (expression, expression)

通常、* DIFF()*関数は、タプル内の2つのバッグを比較します。 以下にその例を示します。ここでは、2つのリレーションを作成し、それらをコグループ化し、それらの差を計算します。

以下に示すように、HDFSディレクトリ /pig_data/emp_sales.txtemp_bonus.txt の2つのファイルがあると仮定します。 emp_sales.txt には営業部門の従業員の詳細が含まれ、 emp_bonus.txt にはボーナスを受け取った従業員の詳細が含まれます。

*emp_sales.txt*
1,Robin,22,25000,sales
2,BOB,23,30000,sales
3,Maya,23,25000,sales
4,Sara,25,40000,sales
5,David,23,45000,sales
6,Maggy,22,35000,sales
*emp_bonus.txt*
1,Robin,22,25000,sales
2,Jaya,23,20000,admin
3,Maya,23,25000,sales
4,Alia,25,50000,admin
5,David,23,45000,sales
6,Omar,30,30000,admin

そして、これらのファイルを、それぞれ emp_sales および emp_bonus というリレーション名でPigにロードしました。

grunt> emp_sales = LOAD 'hdfs://localhost:9000/pig_data/emp_sales.txt' USING PigStorage(',')
   as (sno:int, name:chararray, age:int, salary:int, dept:chararray);

grunt> emp_bonus = LOAD 'hdfs://localhost:9000/pig_data/emp_bonus.txt' USING PigStorage(',')
   as (sno:int, name:chararray, age:int, salary:int, dept:chararray);

以下に示すように、COGROUP演算子を使用して、リレーション emp_sales および emp_bonus のレコード/タプルをキー* sno、*でグループ化します。

grunt> cogroup_data = COGROUP emp_sales by sno, emp_bonus by sno;

以下に示すように、 DUMP 演算子を使用してリレーション cogroup_data を確認します。

grunt> Dump cogroup_data;

(1,{(1,Robin,22,25000,sales)},{(1,Robin,22,25000,sales)})
(2,{(2,BOB,23,30000,sales)},{(2,Jaya,23,20000,admin)})
(3,{(3,Maya,23,25000,sales)},{(3,Maya,23,25000,sales)})
(4,{(4,Sara,25,40000,sales)},{(4,Alia,25,50000,admin)})
(5,{(5,David,23,45000,sales)},{(5,David,23,45000,sales)})
(6,{(6,Maggy,22,35000,sales)},{(6,Omar,30,30000,admin)})

2つの関係の違いを計算する

次に、* DIFF()関数を使用して2つの関係の差を計算し、以下に示すように関係 *diff_data に保存します。

grunt> diff_data = FOREACH cogroup_data GENERATE DIFF(emp_sales,emp_bonus);

検証

以下に示すように、DUMP演算子を使用してリレーション diff_data を確認します。

grunt> Dump diff_data;

({})
({(2,BOB,23,30000,sales),(2,Jaya,23,20000,admin)})
({})
({(4,Sara,25,40000,sales),(4,Alia,25,50000,admin)})
({})
({(6,Maggy,22,35000,sales),(6,Omar,30,30000,admin)})
*emp_bonus* と *emp_sales* のレコードが一致する場合、 *diff_data* リレーションには空のタプルが含まれます。 それ以外の場合、両方のリレーションからのタプル(異なるタプル)を保持します。

たとえば、 sno を持つレコードを 1 として考えると、両方の関係((1、Robin、22,25000、sales)、(1、Robin、22,25000、 sales))。 したがって、* DIFF()関数の結果である *diff_data リレーションでは、 sno 1 の空のタプルを取得します。