1

Pig で比較したい 2 つのデータ セットがあります。どちらも同じ一意の ID を持ち、2 番目のデータ セットの名前がランダムに変更されています。ロジックは次のとおりです。

  • empl1 の生データを読み込む
  • empl2 の生データを読み込む
  • 「names are not same」と「emplno is equal」の行を選択

私はやった:

A1=  LOAD 'cassandra://employees_pig1/employees_cf' USING CassandraStorage() AS (key, columns: bag {T: tuple(name, value)});

B1=  LOAD 'cassandra://employees_pig2/employees_cf' USING CassandraStorage() AS (key, columns: bag {T: tuple(name, value)});

A2 = FOREACH A1 GENERATE key, FLATTEN(columns);

B2 = FOREACH B1 GENERATE key as key2, FLATTEN(columns);

へー、フォーラムに画像を投稿できません。イラストA2、B2のリンクはこちら https://picasaweb.google.com/lh/photo/SU3QgKsbA4nmq83cdnhiVdMTjNZETYmyPJy0liipFm0?feat=directlink

今すぐ助けが必要です。私はこれに正しく取り組んでいますか?

C1 = join A2 by key, B2 by key2;

D1= filter C1 by A2.key==B2.key2 -- cannot do a A2.first_name!=B2.first_name;

「names are not the same」と「emplno is equal」の選択行を実行したいのですが、その 方法が完全にはわかりません。アドバイスお願いします。

ありがとう

更新: - 結合の代わりに、cogroup C3= COGROUP A2 by key, B2 by key2; を実行しました。

https://picasaweb.google.com/lh/photo/_lkEqW4BvIgbnZSHKDCJGNMTjNZETYmyPJy0liipFm0?feat=directlink

次は、しようと思っています

D1= FOREACH C3 GENERATE group, A2.first_name as fn1, B2.first_name as fn2

グループは目的の結果 (つまり empno) を返しますが、'A2.first_name, B2.first_name' は正しくありません。A2 および B2 バッグ/タプル内のデータにアクセスする方法を知る必要があります。

その後、FILTER BY fn1==fn2 を実行できます。

4

2 に答える 2

1

解決しました:)

手順:-pygmalionをダウンロードするhttps://github.com/jeromatron/pygmalion/downloads

クイックテスト:

register '/usr/share/dse/pygmalion/pygmalion-1.0.0.jar';
define FromCassandraBag org.pygmalion.udf.FromCassandraBag();
define ToCassandraBag org.pygmalion.udf.ToCassandraBag();

A1=  LOAD 'cassandra://employees_pig1/employees_cf' USING CassandraStorage() AS (key,
columns: bag {T: tuple(name, value)});
B1=  LOAD 'cassandra://employees_pig2/employees_cf' USING CassandraStorage() AS (key, 
columns: bag {T: tuple(name, value)});

A2 = foreach A1 generate key,
flatten(org.pygmalion.udf.FromCassandraBag('first_name', columns))
as (first_name: chararray);

B2 = foreach B1 generate key,
flatten(org.pygmalion.udf.FromCassandraBag('first_name', columns))
as (first_name: chararray);

C1 = join A2 by key, B2 by key;
D1= filter C1 BY A2::first_name != B2::first_name;
于 2012-11-29T04:00:07.077 に答える
1

a JOIN(少なくとも、上記で行った内部結合) を実行することで、emplnofromABが等しいことを確認できます。nameあとは、 s が同じかどうかでフィルタリングするだけです。

C1 = join A2 by key, B2 by key;
D1 = filter C1 by A2::name != B2::name;
于 2012-11-28T19:34:16.033 に答える