2016-08-31 7 views
0

Я хочу реализовать простой фильтр даты, и я чувствую, что это не так просто, как я думал.Простой фильтр даты в каскаде

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
    Date date = new Date(); 
    String datestring = dateFormat.format(date); 

    ExpressionFilter dateFilter = new ExpressionFilter("datefield1 <= datestring", String.class); 
    inputPipe = new Each(inputPipe,dateFilter); 

datefield1 это поле в inputPipe, который я хочу, чтобы фильтровать на основе текущей даты. Проблема с приведенным выше кодом заключается в том, что он ожидает найти поля, упомянутые в ExpressionFilter, для присутствия в inputPipe. datestring не является полем в inputPipe, и, следовательно, он не работает.

Также пробовал этот способ, но он выдает ошибку компиляции. Я новичок в Cascading и Java, поэтому, пожалуйста, извините, если я пропущу что-нибудь.

ExpressionFilter dateFilter = new ExpressionFilter("datefield1 <= "+datestring, String.class); 
+0

Попробуйте использовать индекс поля вместо имени в inputPipe. Хотя я не понимаю, как сравнение строк будет похоже на сравнение даты. – Amit

+0

Посмотрите следующее решение: http://stackoverflow.com/a/36351176/2421561 – Ambrish

ответ

1

Вы можете посмотреть на каскадных Filter вариант

Создать фильтр как следующий

public class DateFilter extends BaseOperation implements Filter { 
    private String dateStr; 
    public DateFilter(String dateStr) { 
     this.dateStr = dateStr; 
    } 

    public boolean isRemove(FlowProcess flowProcess, FilterCall filterCall) { 
     // get the arguments TupleEntry 
     TupleEntry arguments = filterCall.getArguments(); 

     // initialize the return result 
     boolean isRemove = false; 

     String inputStr = argument.getString("datefield1"); // Get the date from datefield1 field 

     isRemove = compareDate(inputStr, dateStr); 

     return isRemove; 
    } 

    private boolean compareDate(String inputStr, String dateStr) { 
     // Add you logic to match the date. Try [joda](http://www.joda.org/joda-time/) 
     return false; 
    } 
} 

После того, как у вас есть фильтр, использовать его в вашем коде, как:

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
Date date = new Date(); 
String datestring = dateFormat.format(date); 

inputPipe = new Each(inputPipe, new DateFilter(datestring)); 

Это должно помочь вам.

Ссылка:

+0

Thanks. Я использовал аналогичную функцию, и теперь она работает – Vinay

1

Вот простой пример, который может помочь вам. Входной файл содержит два поля: «name» и «dob». Программа фильтрует всю недействительную будущую добу. Ввод содержит следующие данные.

ABC, 2010-01-01 
DEF, 2012-04-05 
GHI, 2016-12-13 
JKL, 2017-04-05 
MNO, 2015-12-03 
PQR, 2016-05-03 

Вот фильтр

class DateFilter extends BaseOperation implements Filter{ 

    SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); 
    @Override 
    public boolean isRemove(FlowProcess flowProcess, FilterCall filterCall) { 
     TupleEntry tupleEntry = filterCall.getArguments(); 
     String date = tupleEntry.getString("dateField1"); 
     Date dateField1 = null; 
     try { 
      dateField1 = f.parse(date); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     if (dateField1.before(new Date())) 
      return false; 
     else 
      return true; 
    } 

Вы можете использовать его как

Pipe pipe = new Pipe("Pipe"); 
pipe = new Each(pipe, new DateFilter()); 

И выход

name,dateField1 
ABC, 2010-01-01 
DEF, 2012-04-05 
MNO, 2015-12-03 
PQR, 2016-05-03 
0

Все, что вам нужно сделать, это вернуться верно для строки, которые нужно удалить в isRemove functi на. Его до вас, как вы хотите извлечь значения. Довольно приятное объяснение в этом link.