2015-10-06 171 views
4

如果我在使用Java 8和Spark迭代文件內容時遇到任何異常,我需要跳過該記錄。Apache Spark RDD和Java 8:異常處理

我不想拋出異常,我只需要跳過該記錄並繼續其他記錄。

代碼示例:

JavaRDD<Model> fileRDD = sc.textFile("filePath") 
       .map(line -> { 
        try { 
        String[] parts = line.split("\\|"); 
        Long key = Long.parseLong(parts[0]; 
        return line; 
        } catch (NumberFormatException nfe) { 
         //if i throw RuntimeException, its working file 
         //but i dont want to throw exception, i want to just skip the line, 
         // how do i do it using java 8 stream methods 
        } 
       }); 

回答

5

可以使用filter代替map

JavaRDD<Model> fileRDD = sc.textFile("filePath") 
      .filter(line -> { 
       try { 
        String[] parts = line.split("\\|"); 
        Long key = Long.parseLong(parts[0]; 
        return true; 
       } catch (NumberFormatException nfe) { 
        return false; 
       } 
      }); 
+0

內地圖我要做很多其他的作品,這樣做地圖之前,我需要進行過濾,然後使用地圖啓動過程的記錄。 – Shankar

+1

@Shankar,當然,你可以先「過濾」,然後是「地圖」。 –

1

String[] parts = line.split("|");

管道字符應該被轉義。

String[] parts = line.split("\\|");

參見:https://stackoverflow.com/a/9808719/3662739

+0

其實我已經逃過了管道人物......對此感謝。 – Shankar

+0

哦,nvm然後xD,我認爲這會使數組中斷,這就是爲什麼你不能跳過。 – zeroTAG

+3

雖然這是對問題的合理評論,但它是*評論*,而不是答案。請避免發表評論作爲答案。當你獲得50的聲望時,你也可以發表評論。 –