StoreFunc抽象クラスには、データを格納するための主要なメソッドがあり、ほとんどのユースケースでは、データを拡張するだけで十分です。拡張機能を実現するために実装できるオプションのインターフェースがあります。
StoreMetadata
このインターフェースには、メタデータシステムと対話してスキーマと統計を格納するメソッドがあります。このインターフェースはオプションであり、メタデータを保存する必要がある場合にのみ実装する必要があります。
StoreFuncでオーバーライドする必要のあるメソッドを以下に説明します。
getOutputFormat():
このメソッドは、Storerが使用するOutputFormatを取得するためにPigによって呼び出されます。 OutputFormatのメソッドは、map-reduceJavaプログラムのHadoopと同じ方法で同じコンテキストでPigによって呼び出されます。 OutputFormatがHadoopパッケージのものである場合、実装はorg.apache.hadoop.mapreduceの下にある新しいAPIベースのものを使用する必要があります。カスタムOutputFormatの場合は、org.apache.hadoop.mapreduceの下の新しいAPIを使用して実装する必要があります。 OutputFormatのcheckOutputSpecs()メソッドは、出力位置を事前にチェックするためにpigによって呼び出されます。このメソッドは、ジョブの起動時にHadoop呼び出しシーケンスの一部としても呼び出されます。したがって、実装では、一貫性のない副作用なしに、このメソッドを複数回呼び出すことができるようにする必要があります。
setStoreLocation():
このメソッドは、店舗の場所を店舗に伝えるためにPigによって呼び出されます。ストアーは、このメソッドを使用して、基になるOutputFormatに同じ情報を伝達する必要があります。このメソッドは、Pigによって複数回呼び出されます。実装では、このメソッドが複数回呼び出されることに注意し、複数回の呼び出しによる一貫性のない副作用がないことを確認する必要があります。
prepareToWrite():
新しいAPIでは、データの書き込みはStoreFuncによって提供されるOutputFormatを介して行われます。 prepareToWrite()では、StoreFuncによって提供されるOutputFormatに関連付けられたRecordWriterがStoreFuncに渡されます。次に、putNext()の実装でRecordWriterを使用して、RecordWriterが期待する方法でデータのレコードを表すタプルを書き込むことができます。
putNext():
putNext()の意味は変更されておらず、Pigランタイムによって呼び出されて、データの次のタプルを書き込みます。新しいAPIでは、これは、実装が基盤となるRecordWriterを使用してタプルを書き出すメソッドです。
StoreFuncのデフォルトの実装:
setStoreFuncUDFContextSignature():
このメソッドは、フロントエンドとバックエンドの両方でPigによって呼び出され、Storerに一意の署名を渡します。シグニチャを使用して、フロントエンドとバックエンドのさまざまなメソッド呼び出しの間にStorerが格納する必要のある情報をUDFContextに格納できます。 StoreFuncのデフォルトの実装には、空の本体があります。このメソッドは、他のメソッドの前に呼び出されます。
relToAbsPathForStoreLocation():
Pigランタイムはこのメソッドを呼び出して、Storerが相対的なストアの場所を絶対的な場所に変換できるようにします。ファイルシステムベースの場所に対してこれを処理する実装がStoreFuncで提供されます。
checkSchema():
Store関数は、この関数を実装して、書き込まれるデータを記述する特定のスキーマが受け入れ可能であることを確認する必要があります。 StoreFuncのデフォルトの実装には、空の本体があります。このメソッドは、setStoreLocation()を呼び出す前に呼び出されます。
実装例:
この例のstorer実装は、行区切り文字が ‘のテキストデータのstorerです。
デフォルトのフィールド区切り文字としての ‘および‘ ‘(コンストラクターで別のフィールド区切り文字を渡すことでオーバーライドできます)–これはPigの現在のPigStorageストアーに似ています。実装では、Hadoopでサポートされている既存のOutputFormat –TextOutputFormatを基になるOutputFormatとして使用します。
public class SimpleTextStorer extends StoreFunc {protected RecordWriter writer = null private byte fieldDel = '' private static final int BUFFER_SIZE = 1024 private static final String UTF8 = 'UTF-8' public PigStorage(){} public PigStorage(String delimiter){this( )if(delimiter.length()== 1){this.fieldDel =(byte)delimiter.charAt(0)} else if(delimiter.length()> 1delimiter.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単一文字 ')}} ByteArrayOutputStream mOut = new ByteArrayOutputStream(BUFFER_SIZE)@Override public void putNext(Tuple f)throws IOException {int sz = f.size()for(int i = 0 i質問がありますか?コメント欄にご記入ください。折り返しご連絡いたします。
関連記事: