级联中的简单日期过滤器
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);
datefield1
是 inputPipe
中的一个字段,我想根据当前日期对其进行过滤。上述代码的问题在于它希望找到 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.
中的解释非常好
我想实现一个简单的日期过滤器,感觉没有想象的那么简单。
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);
可以看看级联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.
中的解释非常好