【问题标题】:Simple Date filter in Cascading级联中的简单日期过滤器
【发布时间】:2016-08-31 20:12:25
【问题描述】:

我想实现一个简单的日期过滤器,感觉没有想象中那么简单。

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

【问题讨论】:

  • 尝试使用字段的索引而不是 inputPipe 中的名称。虽然我不明白字符串比较与日期比较有何相似之处。
  • 看下面的解决方案:stackoverflow.com/a/36351176/2421561

标签: java filter cascading


【解决方案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));

这应该对你有帮助。

参考:

【讨论】:

  • 谢谢。我使用了类似的功能,现在可以使用了
【解决方案2】:

这是一个可以帮助您的简单示例。 输入文件包含两个字段“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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 2013-03-22
      • 2019-08-02
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多