2017-05-14 3 views
1

Ich versuche, eine normale Datei von HDFS in der Klasse zu lesen, die ich durch das Senden von Funken ausführen würde.Sollte ich einen StringBuilder oder einen StringBuffer in Spark verwenden?

Ich habe eine Methode, die eine String-Operationen und seine aus dieser Zeichenfolge Ausgabe ich RDD erstellen.

Ich führe die folgenden String-Operationen vor dem Erstellen einer RDD.

Sollte ich einen StringBuilder oder einen StringBuffer für die Variable valueString verwenden?

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

Antwort

1

Die only difference between the two ist, dass StringBuffersynchronized Methoden hat (das ist etwas, das man so gut wie nie brauchen). Behalten Sie also die valueString eine lokale Variable und gehen Sie mit StringBuilder.

WertString = WertString.Concat (GetrimmteLinie.Kontrolle ("\ n"));

Diese Art von Code fragt mich, ob Sie einen mehrzeiligen String überhaupt verketten wollen. Vielleicht können Sie stattdessen eine RDD mit einer Liste von Zeilen erstellen und einen Teil der aktuellen Vorverarbeitung selbst in einen Spark-Job verschieben?

+0

Ich verstehe den thread-sicheren Teil, der Zweifel, den ich hatte war, hat Multithreading irgendetwas mit lokalen Variablen zu tun, während ich durch Funken-Submission ausführen? –

+0

Thread-Sicherheit ist nur ein Problem, wenn Sie das Objekt zwischen mehreren Threads teilen. Wenn Ihr StringBuilder nur innerhalb einer einzigen Methode lebt und Sie ihn nie irgendwo weitergeben (wie sie normalerweise verwendet werden, wird nur der resultierende String ausgegeben), dann geht es Ihnen gut. – Thilo

+0

"Wenn Ihr StringBuilder nur innerhalb einer einzigen Methode lebt". Lokale Variablen leben auf dem Stack. Wenn zehn Threads dieselbe Methode ausführen, erhalten sie jeweils ihre eigene unabhängige "Kopie". (Wenn Sie die Referenz an eine Stelle außerhalb der Methode übergeben, z. B. wenn Sie sie auf ein Objektfeld setzen, erhalten andere Threads möglicherweise die Instanz.) – Thilo

Verwandte Themen