级联中的简单日期过滤器

Simple Date filter in 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 中提到的字段出现在 inputPipe 中。 datestring 不是 inputPipe 中的字段,因此它在那里失败。

也试过这种方式,但编译出错。我是 Cascading 和 Java 的新手,所以如果我遗漏了什么,请原谅。

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

可以看看级联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));

这应该对你有帮助。

参考:

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

对于需要在 isRemove 函数中删除的行,您需要做的就是 return true。如何提取值取决于您。 link.

中的解释非常好