2016-03-30 8 views
1

次の出力が必要です。CASE文を豚に使用するには?

NE 50 
SE 80 

私は地域に基づいて国を数えるためにpigクエリを使用しています。

c1 = group country by zone; 
c2 = foreach c1 generate COUNT(country.zone), (
case country.zone 
when 1 then 'NE' 
else 'SE' 
); 

しかし、出力を達成できません。次のようなエラーが表示されます。

2016-03-30 13:57:16,569 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1039: (Name: Equal Type: null Uid: null)incompatible types in Equal Operator left hand side:bag :tuple(zone:int) right hand side:int 
Details at logfile: /home/cloudera/pig_1459370643493.log 

しかし、私は次のクエリを使用して実行できました。

c2 = foreach c1 generate group, COUNT(country.zone); 

これは、次のような出力が得られます:

(1,50) 
(2,80) 

は、どのように私の代わりに1のNEとSEの代わりに、2を追加することができますか?私はCASEを使用すると助けになると思ったが、私はエラーが発生している。誰も助けることができますか?

答えて

3

EDIT

豚0.12.0バージョンは現在、CASE式をサポートしています。

c2 = FOREACH c1 GENERATE (CASE group 
           WHEN 1 THEN 'NE' 
           WHEN 2 THEN 'SE' 
           WHEN 3 THEN 'AE' 
           ELSE 'VR' END), COUNT(country.zone); 

古い豚のバージョン

豚はstatement.Your最良のオプションは、グループの値は2つだけに限定されている、あなたがチェックするbincond演算子を使用することができますUDF.If使用する場合はありません。値

c2 = foreach c1 generate (group == 1 ? 'NE' : 'SE'), COUNT(country.zone); 

複数の値がある場合は、これを使用します。出力を生成するためにテスト値を使用しました。豚1​​2で

入力

Input

c2 = FOREACH c1 GENERATE (group == 1 ? 'NE' : 
         (group == 2 ? 'SE' : 
         (group == 3 ? 'AE' : 'VR'))), COUNT(country.zone); 

出力

Output

+0

次のように私は出力が必要な場合はどう: NE 50 SE 80 AE 50 VR 40 foreachステートメントを使用して、すべての4つのゾーンとカウントした国を比較します。 – bthapa

+0

@BXT NE、SE AE、VRの対応する値は何ですか? 1,2,3,4? –

+0

このような明確な説明をいただき、ありがとうございます。私はHiveのようにCASE文を使ってしまい、混乱しました。私はあなたの仕事に本当に感謝しています。 Big dataとhadoop用のブログもありますので、初心者の方も簡単に学習できますか? – bthapa

0

以降では、豚

にcase文を使用することができます210

あなたの場合、country.zoneはバッグであり、それをintと比較することはできません

0

上記のエラーが表示されます。

​​

ので、作業コードを更新:

c2 = FOREACH c1 GENERATE (CASE group 
          WHEN 1 THEN 'NE' 
          WHEN 2 THEN 'SE' 
          WHEN 3 THEN 'AE' 
          ELSE 'VR' END), COUNT(country.zone); 

出力:

(NE, 50) 
(SE, 80) 
(AE, 30)