2017-05-14 3 views
1

私はspark-submitによって実行されるクラスのHDFSから通常のファイルを読み込もうとしています。SparkでStringBuilderまたはStringBufferを使用する必要がありますか?

私はString操作を行い、この文字列出力からRDDを作成するメソッドを持っています。

RDDを作成する前に、以下の文字列操作を実行しています。

変数valueStringにStringBuilderまたはStringBufferを使用する必要がありますか?

 while ((line = bf.readLine()) != null) { 
     String trimmedLine=line.trim(); 
     if(trimmedLine.charAt((trimmedLine.length()-1))==';'){ 
      if(extractionInProgress){ 
       valueString=valueString.concat(trimmedLine.substring(0,trimmedLine.indexOf(";"))); 
       keyValues.put(searchKey, valueString); 
       extractionInProgress=false; 
       valueString=""; 
      } 
      else{ 
       int indexOfTab=trimmedLine.indexOf(" "); 
       if(indexOfTab > -1){ 
        String keyInLine=trimmedLine.substring(0,indexOfTab); 
        valueString=trimmedLine.substring(indexOfTab+1,trimmedLine.indexOf(";")); 
        keyValues.put(keyInLine, valueString); 
        valueString=""; 
       } 
      } 
     } 
     else{ 
      if(!extractionInProgress){ 
       searchKey=trimmedLine; 
       extractionInProgress=true; 
      } 
      else{ 
       valueString=valueString.concat(trimmedLine.concat("\n")); 
      } 
     } 
    } 

答えて

1

only difference between the twoStringBufferは(あなたが必要とすることはほとんどないものです)​​メソッドを持っていることです。したがって、valueStringはローカル変数であり、StringBuilderとなります。

valueString = valueString.concat(trimmedLine.concat( "\ n")));

この種のコードは、複数行の文字列を連結したいかどうか疑問に思います。たぶんあなたはラインのリストを使ってRDDを作り、現在の前処理のいくつかをSparkの仕事そのものに移すことができますか?

+0

スレッドセーフな部分を理解していますが、私がspark-submitを実行している間、マルチスレッドはローカル変数と関係がありますか? –

+0

スレッドセーフティは、複数のスレッド間でオブジェクトを共有する場合にのみ問題になります。あなたのStringBuilderが単一のメソッド内にしか存在せず、どこにも渡すことは決してありません(通常はどのように使用され、結果のStringだけが出力されます)。 – Thilo

+0

"StringBuilderが1つのメソッド内にしか存在しない場合"。ローカル変数はスタック上に存在します。 10個のスレッドが同じメソッドを実行する場合は、それぞれ独自の「コピー」を取得します。 (もちろん、メソッドをオブジェクトフィールドに設定するなど、メソッドの外側の参照を渡すと、他のスレッドがインスタンスを保持することがあります)。 – Thilo

関連する問題