2011-04-22 3 views
1

LoadFuncを拡張しています。 getNext関数では、特定の条件の下でタプルを返すのをスキップしたいと思います。この方法では、データファイルのサンプルのみを読み込むことができます。私は戻ってほしくない行のnullを返そうとしましたが、最初のnullタプルが返された後にメソッドが終了するという問題があります。LoadFunc.getNext()内のレコードをスキップします。

これを行う方法を知っている人はいますか?私は別の方法でそれを行うべきですか?

ありがとうございます。

答えて

4

私はあなたが単にgetNext()法の本来の文書使用を壊さないために何をしたいん新しいメソッドを書くことをお勧め

を(...あなたは豚でLoadFuncを意味すると仮定)。

LoadFuncを継承し、どのようにgetNext()を実装しているかについては、Pigクラスのソースを参照してください。例:TextLoader

そこから、実行しようとしていることを行うのはかなり簡単です。 getNext()方法はRecordReaderから読んでいる

(これは例として、たTextReaderを使用している)

編集しようとすると、もう少し詳細なヘルプを提供します。それはRecordReader.nextKeyValue()を呼び出して次のレコードに進むことによって行います。それが真である(レコードを読み取ったことを意味する)かどうかをチェックし、レコードがある場合は、RecordReader.getCurrentValue()を呼び出して値を取得します。

あなただけgetNext()にサンプルとして五回ごとに1を望んでいたとしましょう:

int count = 0; 
Text myText = null; 
whlie(myRecordReader.nextKeyValue() == true) 
{ 
    if (count == 4) 
    { 
      myText = (Text) myRecordReader.getCurrentValue(); 
      break; 
    } 

    count++; 
} 

if (myText != null) // we didn't hit the end; we have a record 
{ 
    ... // create the tuple 
    return myTuple; 
} 
else 
    return null; 

私は前にこれを読んでいた

+0

は私の愚かなオフずつのミスを修正)。問題は、ファイル内のレコードのランダムなサブセットのみをロードする場合、getNextメソッドを使用する方法がないことです。それはロジックを実装するgetNextメソッドの外のメソッドを調べるべきかどうかを私が見ている場所です。 – Winter

+0

@Winter - erm、そうするようにしています。 'getNext()'のように時刻に返されたメソッドを使いたいのであれば、すでに返っていたものを追跡する必要があります。サンプルセットを返す場合は、そうです。 'public Tuple [] returnSampleSet()'のようなものです(望むなら、 'List'を返す)。 –

+0

上記の私の編集を参照してください - それはサンプルとして一度に1つずつ、5つ1つずつ得ることができる方法です。 –

関連する問題