Пропустить запись в LoadFunc.getNext () - PullRequest
1 голос
/ 22 апреля 2011

Я расширяю LoadFunc. В функции getNext я хотел бы пропустить возврат кортежа при определенных условиях - таким образом, я мог загрузить только образец файла данных. Я попытался вернуть ноль для строк, которые я не хочу возвращать, но проблема в том, что метод завершается после возвращения первого нулевого кортежа.

Кто-нибудь знает способ сделать это? Должен ли я сделать это другим способом?

Заранее спасибо.

1 Ответ

4 голосов
/ 23 апреля 2011

(Предполагая, что вы имеете в виду LoadFunc в Pig ...)

Я бы предложил написать новый метод, который делает то, что вы хотите, просто чтобы не нарушать оригинальное документированное использование getNext() method.

Вы должны взглянуть на источник классов Pig, расширяющих LoadFunc, и посмотреть, как они реализуют getNext().Например: TextLoader

Оттуда должно быть довольно тривиально делать то, что вы пытаетесь сделать.

Редактировать, чтобы попытаться предложить немного большеподробная справка:

(в качестве примера используется TextReader)

Метод getNext() читает из RecordReader.Это делается путем вызова RecordReader.nextKeyValue() для перехода к следующей записи.Вы проверяете, верно ли это (имеется в виду чтение записи), и если это так, вы вызываете RecordReader.getCurrentValue(), чтобы получить значение.

Допустим, вы хотите, чтобы только каждый пятый в качестве образца использовался в getNext():

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;

( исправил мою глупую ошибку "один на один" )

...