Apache spark 我应该在Spark中使用StringBuilder还是StringBuffer?
我试图从类中的HDFS读取一个普通文件,我将通过spark submit执行该文件 我有一个方法,它执行字符串操作,并从这个字符串输出创建RDD 在创建RDD之前,我正在执行以下字符串操作 我应该为变量valueString使用StringBuilder还是StringBufferApache spark 我应该在Spark中使用StringBuilder还是StringBuffer?,apache-spark,stringbuilder,stringbuffer,spark-submit,Apache Spark,Stringbuilder,Stringbuffer,Spark Submit,我试图从类中的HDFS读取一个普通文件,我将通过spark submit执行该文件 我有一个方法,它执行字符串操作,并从这个字符串输出创建RDD 在创建RDD之前,我正在执行以下字符串操作 我应该为变量valueString使用StringBuilder还是StringBuffer while ((line = bf.readLine()) != null) { String trimmedLine=line.trim(); if(trimmedL
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"));
}
}
}
问题是StringBuffer
有synchronized
方法(这是您几乎不需要的)。因此,将valueString
保留为局部变量,然后使用StringBuilder
valueString=valueString.concat(trimmedLine.concat(“\n”)
这种代码让我想知道是否要连接多行字符串。也许你可以用一个行列表来生成RDD,并将当前的一些预处理转移到Spark作业本身中 我理解线程安全部分,我的疑问是,当我通过spark submit执行时,多线程是否与局部变量有关?只有在多个线程之间共享对象时,线程安全才是一个问题。如果您的StringBuilder只存在于单个方法中,而您从未将其传递到任何地方(这是它们通常使用的方式,只有结果字符串得到输出),那么您就可以了。“如果您的StringBuilder只存在于单个方法中”。局部变量位于堆栈上。如果十个线程运行相同的方法,那么它们每个线程都会获得自己的独立“副本”。(当然,如果您将引用传递到方法之外的某个地方,例如将其设置为对象字段,那么其他线程可能会获得实例)。