Apache Pig UDF:パート1 –評価、集計、フィルター機能



この投稿では、Apache Pig UDF(Eval、Aggregate&Filter関数)について説明します。 Eval、Aggregate、Filter関数を見てください。

Apache Pigは、カスタム処理を指定する方法として、ユーザー定義関数(UDF)の広範なサポートを提供します。 Pig UDFは現在、次の3つの言語で実行できます。 Java、Python、JavaScript、Ruby。 最も広範なサポートは、Java関数に対して提供されます。





Java UDFは、複数の方法で呼び出すことができます。最も単純なUDFは、EvalFuncを拡張するだけで、exec関数のみを実装する必要があります。すべてのEvalUDFはこれを実装する必要があります。さらに、関数が代数的である場合、クエリのパフォーマンスを大幅に向上させるために代数的インターフェイスを実装できます。

豚におけるUDFの重要性:

Pigを使用すると、ユーザーはUDFを介して既存の演算子を自分または他のユーザーのコードと組み合わせることができます。 Pigの利点は、ユーザーがUDFを介してオペレーターを自分のコードまたは他のコードと組み合わせることができることです。バージョン0.7までは、すべてのUDFはJavaで記述されている必要があり、Javaクラスとして実装されています。これにより、Javaクラスを記述してPigにJARファイルについて通知することにより、新しいUDFをPigに簡単に追加できます。



Pig自体にはいくつかのUDFが付属しています。バージョン0.8より前は、標準のSQL集計関数とその他のいくつかの関数のみを含む非常に限定されたセットでした。 0.8では、多数の標準文字列処理、数学、および複合型UDFが追加されました。

演算子の力へのJava

貯金箱とは何ですか?

Piggybankは、Pigと一緒にリリースされるユーザー提供のUDFのコレクションです。 PiggybankUDFはPigJARに含まれていないため、スクリプトに手動で登録する必要があります。独自のUDFを作成したり、他のユーザーが作成したUDFを使用したりすることもできます。

評価関数

UDFクラスは、すべてのEval関数のベースであるEvalFuncクラスを拡張します。すべての評価関数は、Javaクラス「org.apache.pig.EvalFunc」を拡張します。 ‘この場合はJava文字列であるUDFの戻り値の型でパラメータ化されます。このクラスのコアメソッドは「exec」です。コードの1行目は、関数がmyudfsパッケージの一部であることを示しています。



PowerBIダッシュボードの作成方法

1つのレコードを受け取り、1つの結果を返します。この結果は、実行パイプラインを通過するすべてのレコードに対して呼び出されます。これには、スクリプトが入力としてUDFに渡すすべてのフィールドを含むタプルが必要です。次に、EvalFuncをパラメーター化したタイプを返します。

この関数は、すべての入力タプルで呼び出されます。関数への入力は、Pigスクリプトで関数に渡される順序で入力パラメーターを持つタプルです。以下に示す例では、関数は文字列を入力として受け取ります。次の関数は、文字列を小文字から大文字に変換します。関数が実装されたので、コンパイルしてJARに含める必要があります。

パッケージmyudfsimport java.io.IOException import org.apache.pig.EvalFunc import org.apache.pig.data.Tuple public class UPPER extends EvalFunc {public String exec(Tuple input)throws IOException {if(input == null || input.size()== 0)return null tr​​y {String str =(String)input.get(0)return str.toUpperCase()} catch(Exception e){throw new IOException( 'キャッチされた例外処理入力行'、 e)}}}

集計関数:

集計関数は、別の一般的なタイプのEval関数です。集計関数は通常、グループ化されたデータに適用されます。 Aggregate関数はバッグを受け取り、スカラー値を返します。多くの集計関数の興味深く価値のある機能は、それらが分散方式で段階的に計算できることです。 Hadoopの世界では、これは、部分的な計算をMap and Combinerで実行でき、最終結果をReducerで計算できることを意味します。

代数的である集計関数がそのように実装されていることを確認することは非常に重要です。このタイプの例には、組み込みのCOUNT、MIN、MAX、およびAVERAGEが含まれます。

カウント は、データのサブセット内の要素の数をカウントし、カウントを合計して最終出力を生成できる代数関数の例です。 COUNT関数の実装を見てみましょう。

インスタンス変数とは
public class COUNT extends EvalFuncimplements Algebraic {public Long exec(Tuple input)throws IOException {return count(input)} public String getInitial(){return Initial.class.getName()} public String getIntermed(){returnIntermed.class。 getName()} public String getFinal(){return Final.class.getName()} static public class Initial extends EvalFunc {public Tuple exec(Tuple input)throws IOException {return TupleFactory.getInstance()。newTuple(count(input)) }} static public class Intermed extends EvalFunc {public Tuple exec(Tuple input)throws IOException {return TupleFactory.getInstance()。newTuple(sum(input))}} static public class Final extends EvalFunc {public Tuple exec(Tuple input)throws IOException {return sum(input)}} static protected Long count(Tuple input)throws ExecException {Object values = input.get(0)if(values instanceof DataBag)return((DataBag)values).size()else if(values instanceof Map)return new Long(((Map)values).size())} static protected Long sum(Tuple i nput)throws ExecException、NumberFormatException {DataBag values =(DataBag)input.get(0)long sum = 0 for(Iterator(Tuple)it = values.iterator()it.hasNext()){Tuple t = it.next( )sum + =(Long)t.get(0)} return sum}}

COUNTは、次のような代数インターフェイスを実装します。

public interface Algebraic {public String getInitial()public String getIntermed()public String getFinal()}

関数を代数的にするには、EvalFuncから派生した3つのクラスの定義で構成される代数インターフェイスを実装する必要があります。コントラクトは、Initialクラスのexecfunctionが1回呼び出され、元の入力タプルに渡されることです。その出力は、部分的な結果を含むタプルです。 Intermedクラスのexec関数は、0回以上呼び出すことができ、InitialクラスまたはIntermedクラスの以前の呼び出しによって生成された部分的な結果を含むタプルを入力として受け取り、別の部分的な結果を持つタプルを生成します。最後に、Finalクラスのexec関数が呼び出され、最終結果がスカラー型として返されます。

フィルタ機能:

フィルタ関数は、ブール値を返すEval関数です。 FILTER演算子やBincond式など、ブール式が適切な場所であればどこでも使用できます。 Apache Pigはブール値を完全にはサポートしていないため、結果が別のオペレーターに出力される「Foreach」などのステートメントにフィルター関数を表示することはできません。ただし、フィルター関数はフィルターステートメントで使用できます。

以下の例は、IsEmpty関数を実装しています。

import java.io.IOException import java.util.Map import org.apache.pig.FilterFunc import org.apache.pig.PigException import org.apache.pig.backend.executionengine.ExecException import org.apache.pig.data.DataBag import org.apache.pig.data.Tuple import org.apache.pig.data.DataType / ***バッグまたはマップが空かどうかを判別します。 * / public class IsEmpty extends FilterFunc {@Override public Boolean exec(Tuple input)throws IOException {try {Object values = input.get(0)if(values instanceof DataBag)return((DataBag)values).size()== 0 else if(values instanceof Map)return((Map)values).size()== 0 else {int errCode = 2102 String msg = '空の状態について' + DataType.findTypeName(values)+ 'をテストできません。 throw new ExecException(msg、errCode、PigException.BUG)}} catch(ExecException ee){throw ee}}}