2016-03-03 63 views
0

在下面的代碼我正在過濾日誌包含404 HTTP狀態代碼,但現在,如果我要篩選日誌包含400-405任何HTTP狀態代碼。有沒有什麼辦法來篩選RDD包含特定模式

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

那麼有什麼選擇嗎?

鑑於是我的樣本日誌記錄

64.242.88.10 - - [07/Mar/2004:20:55:43 -0800] "GET /mailman/listinfo/hs_support HTTP/1.1" 200 6294 
64.242.88.10 - - [07/Mar/2004:20:56:56 -0800] "GET /twiki/bin/view/TWiki/WebTopicList HTTP/1.1" 200 14070 
64.242.88.10 - - [07/Mar/2004:20:58:27 -0800] "GET /twiki/bin/attach/TWiki/WebPreferences HTTP/1.1" 401 12846 
64.242.88.10 - - [07/Mar/2004:21:03:48 -0800] "GET /twiki/bin/view/TWiki/TWikiFAQ HTTP/1.1" 200 12050 
64.242.88.10 - - [07/Mar/2004:21:06:05 -0800] "GET /twiki/bin/oops/TWiki/DefaultPlugin?template=oopsmore&param1=1.5&param2=1.5 HTTP/1.1" 200 11281 
+0

添加日誌的樣品將在增加了更爲正確答案提供幫助。 – gfelisberto

+0

你可以看到我更新的問題。 –

回答

2

一個簡單的方法是:

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

希望它能幫助。

+0

謝謝哥哥它的工作! –

+1

Justin使用的正則表達式更加優雅。我改變了我的答案,在包含HTTP代碼的日誌塊中使用正則表達式。 – gfelisberto

2

我認爲,正則表達式在這裏工作:

return v1.matches(".*40[0-5].*") 

這與包含400-405字符串匹配任何內容。這也意味着,如果400以另一種方式登錄,它會將其提取出來。你可能想拆就分隔符,然後強制轉換爲Int並做適當的檢查。

+0

感謝您的努力.. –

相關問題