Apache Pig UDF:パート2 –ロード関数



この投稿では、Apache PigUDF-ロード関数について説明します。 (Apache Pig UDF:パート2)。 Apache PigUDFのロード関数を見てください。

今日の投稿は、ApachePigのロード関数についてです。これはの続編です 最初の投稿 Eval、Filter、AggregateなどのUDF関数をカバーしました。 Pig UDFの他の機能の詳細については、それらを参照してください。





Pigのload関数は、Hadoopがデータを読み取るために使用するクラスであるHadoopのInputFormatの上に構築されています。 InputFormatには2つの目的があります。マップタスク間で入力をフラグメント化する方法を決定し、それらのマップタスクへの入力としてキーと値のペアを生成するRecordReaderを提供します。 load関数の基本クラスはLoadFuncです。

負荷機能–分類:

LoadFunc抽象クラスには、データをロードするための3つの主要なメソッドがあり、ほとんどのユースケースでは、データを拡張するだけで十分です。拡張機能を実現するために実装できる他の3つのオプションのインターフェースがあります。



  • LoadMetadata:

LoadMetadataには、メタデータを処理するメソッドがあります。ローダーのほとんどの実行では、メタデータシステムとやり取りしない限り、これを実装する必要はありません。このインターフェースのgetSchema()メソッドは、ローダーの実装がデータのスキーマについてPigに通信する方法を提供します。ローダーの実装が実数型のフィールドで構成されるデータを返す場合、getSchema()メソッドを介して返されるデータを説明するスキーマを提供する必要があります。他のメソッドは、パーティションキーや統計などの他のタイプのメタデータを処理します。これらのメソッドが他の実装に対して有効でない場合、実装はこれらのメソッドに対してnullの戻り値を返す可能性があります。

  • LoadPushDown:

LoadPushDownには、Pigランタイムからローダー実装に操作をプッシュするためのさまざまなメソッドがあります。現在、pushProjection()メソッドのみがPigによって呼び出され、ローダーと通信します。これは、Pigスクリプトで必要な正確なフィールドです。ローダーの実装は、要求に従うかどうかを選択できます。ローダーの実装が要求に従うことを決定した場合、クエリのパフォーマンスを向上させるためにLoadPushDownを実装する必要があります。

Javaのクラスとインターフェイス
  • pushProjection():

このメソッドは、Pigスクリプトで必要なフィールドをLoadFuncに通知します。したがって、LoadFuncを有効にすると、必要なフィールドのみをロードしてパフォーマンスを向上させることができます。 pushProjection()は「requiredFieldList」を取ります。「requiredFieldList」は読み取り専用であり、LoadFuncで変更することはできません。 「requiredFieldList」には「requiredField」のリストが含まれます。各「requiredField」はPigスクリプトに必要なフィールドを示し、インデックス、エイリアス、タイプ、およびサブフィールドで構成されます。 Pigは、列インデックスrequiredField.indexを使用して、Pigスクリプトに必要なフィールドについてLoadFuncと通信します。必須フィールドがマップの場合、Pigは「requiredField.subFields」を渡します。これには、マップのPigスクリプトに必要なキーのリストが含まれています。



  • LoadCaster:

LoadCasterには、バイト配列を特定の型に変換する手法があります。 DataByteArrayフィールドから他のタイプへの暗黙的または明示的なキャストをサポートする必要がある場合、ローダー実装はこれを実装する必要があります。

LoadFunc抽象クラスは、ローダーを実装するために拡張するメインクラスです。オーバーライドする必要のある方法を以下に説明します。

  • getInputFormat():

    このメソッドは、ローダーが使用するInputFormatを取得するためにPigによって呼び出されます。 InputFormatのメソッドは、MapReduceJavaプログラムのHadoopと同じ方法でPigによって呼び出されます。 InputFormatがHadoopパッケージのものである場合、実装はorg.apache.hadoop.mapreduceの下にある新しいAPIベースのものを使用する必要があります。カスタムInputFormatの場合は、org.apache.hadoop.mapreduceの新しいAPIを使用して実装することをお勧めします。

  • setLocation():

    このメソッドは、ロード場所をローダーに伝達するためにPigによって呼び出されます。ローダーは、このメソッドを使用して、同じ情報をコアのInputFormatに伝達する必要があります。このメソッドは、豚によって複数回呼び出されます。

  • prepareToRead():

    このメソッドでは、LoadFuncによって提供されるInputFormatに関連するRecordReaderがLoadFuncに渡されます。これで、getNext()の実装でRecordReaderを使用して、データのレコードを表すタプルをPigに返すことができます。

  • getNext():

    getNext()の意味は変更されておらず、データ内の次のタプルを取得するためにPigランタイムによって呼び出されます。このメソッドでは、実装は基礎となるRecordReaderを使用し、返すタプルを構築する必要があります。

LoadFuncのデフォルトの実装:

LoadFuncのデフォルトの実装は、必要な場合にのみオーバーライドする必要があることに注意してください。

Hadoopを学ぶのは難しい
  • setUdfContextSignature():

    このメソッドは、フロントエンドとバックエンドの両方でPigによって呼び出され、ローダーに一意の署名を渡します。署名を利用して、ローダーがフロントエンドとバックエンドのさまざまなメソッド呼び出しの間に格納する必要のある情報をUDFContextに格納できます。ユースケースは、getNext()でタプルを返す前に、バックエンドで使用するために、渡されたRequiredFieldListをLoadPushDown.pushProjection(RequiredFieldList)に格納することです。 LoadFuncのデフォルトの実装には、空の本体があります。このメソッドは、他のメソッドの前に呼び出されます。

  • relatedToAbsolutePath():

    Pigランタイムはこのメソッドを呼び出して、ローダーが相対的なロード場所を絶対的な場所に変換できるようにします。 LoadFuncで提供されるデフォルトの実装は、ファイルシステムの場所に対してこれを処理します。ロードソースが他のものである場合、ローダーの実装はこれをオーバーライドすることを選択できます。

この例のローダーの実装は、行区切り文字が「」であるテキストデータのローダーです。
Pigの現在のPigStorageローダーと同様のデフォルトのフィールド区切り文字としての ‘および‘ ‘。実装では、Hadoopでサポートされている既存のInputformat – TextInputFormat –を基になるInputFormatとして使用します。

public class SimpleTextLoader extends LoadFunc {protected RecordReader in = null private byte fieldDel = '' private ArrayList mProtoTuple = null private TupleFactory mTupleFactory = TupleFactory.getInstance()private static final int BUFFER_SIZE = 1024 public SimpleTextLoader(){} / ***を構築します指定された文字をフィールド区切り文字として使用するピッグローダー。 * * @param delimiter *フィールドを区切るために使用される1バイト文字。 *( ''がデフォルトです。)* / public SimpleTextLoader(String delimiter){this()if(delimiter.length()== 1){this.fieldDel =(byte)delimiter.charAt(0)} else if( delimiter.length()> 1 && delimiter.charAt(0)== ''){switch(delimiter.charAt(1)){case't ':this.fieldDel =(byte)' 'break case'x' :fieldDel = Integer.valueOf(delimiter.substring(2)、16).byteValue()break case'u ':this.fieldDel = Integer.valueOf(delimiter.substring(2))。byteValue()break default:throw new RuntimeException( 'Unknown delimiter' + delimiter)}} else {throw new RuntimeException( 'PigStorage delimeter must be a single character')}} @Override public Tuple getNext()throws IOException {try {boolean notDone = in.nextKeyValue()if (notDone){return null}テキスト値=(テキスト)in.getCurrentValue()byte [] buf = value.getBytes()int len = value.getLength()int start = 0 for(int i = 0 i質問がありますか?コメント欄にご記入ください。折り返しご連絡いたします。 

関連記事: