我想实现一个简单的日期过滤器,我觉得它并不像我想象的那么容易。
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 :(得分: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中非常好的解释。