2017-02-16 4 views
1

私は入力としてdatabag(final)を渡そうとしています。PIGのUDFの入力としてバッグを渡す

dump final; 

ができます: -

私は私は私のUDFかどうかを確認する必要があることを行うためには、上記databagを処理し、送信元と送信先との間のミスマッチを見つけるためのUDFを書くことについてだ
(4,john,john,David,Banking ,4,M,20-01-1994,78.65,345000,Arkansasdest1,Destination) 
(4,john,john,David,Banking ,4,M,20-01-1994,78.65,345000,Arkanssdest2,Destination) 
(4,johns,johns,David,Banking ,4,M,20-01-1994,78.65,345000,ArkansasSrc1,source) 
(4,johns,johns,David,Banking ,4,M,20-01-1994,78.65,345000,ArkansaSrc2,source) 

データバッグを受け入れるかどうか。私は、一つのサンプルUDF下に書いた:07:05875 [メイン] org.apache.pig.newplan WARNその後

package PigUDFpck; 

import java.io.IOException; 
import java.util.Iterator; 
import org.apache.pig.EvalFunc; 
import org.apache.pig.data.BagFactory; 
import org.apache.pig.data.DataBag; 
import org.apache.pig.data.Tuple; 
import org.apache.pig.data.TupleFactory; 


public class databag extends EvalFunc<DataBag> { 
TupleFactory mTupleFactory = TupleFactory.getInstance(); 
BagFactory mBagFactory = BagFactory.getInstance(); 

public DataBag exec(Tuple input) throws IOException { // different return type 

    DataBag result = mBagFactory.newDefaultBag(); // change here 
    DataBag values = (DataBag)input.get(0); 
    for (Iterator<Tuple> iterator = values.iterator(); iterator.hasNext();) { 
     Tuple tuple = iterator.next(); 

     //logic 
     Tuple t = mTupleFactory.getInstance().newTuple(); 


     t.append(tuple); 

     result.add(t); 
    } 
    return result; // change here 
} 

} 

私は

REGISTER /usr/local/pig/UDF/UDFBAG.jar; 
DEFINE Databag Databag(); // not sure how to define it 

2017年2月16日19が使用してパスを登録し.BaseOperatorPlan - IMPLICIT_CAST_TO_INTに2回の警告が発生しました。 //定義後にこの警告を受け取りました。

final1 = FOREACH final GENERATE(Databag(final)); 

ERROR 1200:豚スクリプトが解析に失敗しました: 無効スカラー投影:ファイナル:それはスカラー

として使用されるために列が関係から投影する必要の定義に私を助けてくださいUDFとどのようにUDFにDataBagを渡す

おかげ

+0

あなたのコードは、警告とエラーが表示されている理由をよく分かりません。 forループで1つの変更を行うことはできますか?iteratorを使用する代わりに 'for(Tuple tuple:values){// you code} 'を使用してください。また、なぜ各行に​​新しいタプルを作成するのですか? –

+0

こんにちはRajen、UDFを定義する方法の形式を教えてください。 – Vickyster

答えて

1

final1 = FOREACH final GENERATE(Databag(*)); 
試してみてください

私の知る限り、あなたの最後にはタプルが含まれていますが、タプルの袋ではありませんので、最初にいくつかのキーでグループ化する必要があります。その場合、それはあなたのようなものです

final1 = FOREACH (group final [by key or all]) GENERATE(Databag(final)); 
関連する問題