Java 有没有办法过滤包含特定模式的RDD
在下面的代码中,我正在筛选包含404 HTTP状态代码的日志,但现在如果我想筛选包含400-405任何HTTP状态代码的日志,请执行以下操作Java 有没有办法过滤包含特定模式的RDD,java,apache-spark,Java,Apache Spark,在下面的代码中,我正在筛选包含404 HTTP状态代码的日志,但现在如果我想筛选包含400-405任何HTTP状态代码的日志,请执行以下操作 JavaRDD<String> IPList = sc.textFile("/home/bhaumik/Documents/access_log", 1) .filter(new Function<String, Boolean>() { @Override publ
JavaRDD<String> IPList = sc.textFile("/home/bhaumik/Documents/access_log", 1)
.filter(new Function<String, Boolean>() {
@Override
public Boolean call(String v1) throws Exception {
// TODO Auto-generated method stub
return v1.contains(" 404 ");
}
});
我认为正则表达式在这里起作用:
return v1.matches(".*40[0-5].*")
这与包含400-405的字符串匹配。这也意味着,如果400以另一种方式出现在日志中,它将拾取它。您可能希望在分隔符上拆分,然后将其转换为
Int
,并进行适当的检查。我认为正则表达式在这里起作用:
return v1.matches(".*40[0-5].*")
这与包含400-405的字符串匹配。这也意味着,如果400以另一种方式出现在日志中,它将拾取它。您可能希望拆分分隔符,然后将其转换为Int
,并进行适当的检查。一种简单的方法是:
return v1.contains(" 400 ")||v1.contains(" 401 ")||v1.contains(" 402 ");
但这样,当文件大小为400…405时,可能会出现误报
一种备选方案可以是:
String[] parts = v1.split(" ");
return parts[parts.length - 2].matches("40[0-5]");
希望有帮助。一个简单的方法是:
return v1.contains(" 400 ")||v1.contains(" 401 ")||v1.contains(" 402 ");
但这样,当文件大小为400…405时,可能会出现误报
一种备选方案可以是:
String[] parts = v1.split(" ");
return parts[parts.length - 2].matches("40[0-5]");
希望有帮助。添加日志样本将有助于添加更正确的答案。您可以看到我更新的问题。添加日志样本将有助于添加更正确的答案。您可以看到我更新的问题。Justin使用的正则表达式更优雅。我改变了答案,在包含HTTP代码的日志块上使用正则表达式。Justin使用的正则表达式更优雅。我更改了答案,在包含HTTP代码的日志块上使用正则表达式。