Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 我应该在Spark中使用StringBuilder还是StringBuffer?_Apache Spark_Stringbuilder_Stringbuffer_Spark Submit - Fatal编程技术网

Apache spark 我应该在Spark中使用StringBuilder还是StringBuffer?

Apache 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

我试图从类中的HDFS读取一个普通文件,我将通过spark submit执行该文件

我有一个方法,它执行字符串操作,并从这个字符串输出创建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"));
            }
        }
    }
问题是
StringBuffer
synchronized
方法(这是您几乎不需要的)。因此,将
valueString
保留为局部变量,然后使用
StringBuilder

valueString=valueString.concat(trimmedLine.concat(“\n”)


这种代码让我想知道是否要连接多行字符串。也许你可以用一个行列表来生成RDD,并将当前的一些预处理转移到Spark作业本身中

我理解线程安全部分,我的疑问是,当我通过spark submit执行时,多线程是否与局部变量有关?只有在多个线程之间共享对象时,线程安全才是一个问题。如果您的StringBuilder只存在于单个方法中,而您从未将其传递到任何地方(这是它们通常使用的方式,只有结果字符串得到输出),那么您就可以了。“如果您的StringBuilder只存在于单个方法中”。局部变量位于堆栈上。如果十个线程运行相同的方法,那么它们每个线程都会获得自己的独立“副本”。(当然,如果您将引用传递到方法之外的某个地方,例如将其设置为对象字段,那么其他线程可能会获得实例)。