级联中的简单日期过滤器

时间:2016-08-31 20:12:25

标签: java filter cascading

我想实现一个简单的日期过滤器,我觉得它并不像我想象的那么容易。

    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);

datefield1inputPipe中我想根据当前日期过滤的字段。上述代码的问题在于,它希望找到ExpressionFilter中提到的字段inputPipedatestring不是inputPipe中的字段,因此它失败了。

也试过这种方式,但它抛出了编译错误。我是Cascading和Java的新手,所以请原谅我是否遗漏了任何东西。

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

3 个答案:

答案 0 :(得分: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));

这应该对你有帮助。

参考:

答案 1 :(得分:1)

以下是可以帮助您的简单示例。 输入文件包含两个字段“name”和“dob”。该程序过滤所有无效的未来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

答案 2 :(得分:0)

您需要做的就是为isRemove函数中需要删除的行返回true。它取决于您如何提取值。这个link中非常好的解释。