【问题标题】:Should I use a StringBuilder or a StringBuffer in Spark? [duplicate]我应该在 Spark 中使用 StringBuilder 还是 StringBuffer? [复制]
【发布时间】:2017-05-14 07:33:03
【问题描述】:

我正在尝试从 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"));
            }
        }
    }

【问题讨论】:

    标签: apache-spark stringbuilder stringbuffer spark-submit


    【解决方案1】:

    only difference between the twoStringBuffersynchronized 方法(这是你几乎不需要的东西)。因此,将valueString 保留为局部变量并使用StringBuilder

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

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

    【讨论】:

    • 我了解线程安全部分,我的疑问是,当我通过 spark-submit 执行时,多线程是否与局部变量有关?
    • 只有在多个线程之间共享对象时,线程安全才是问题。如果你的 StringBuilder 只存在于一个方法中并且你从不将它传递到任何地方(这是它们通常的使用方式,只有生成的 String 得到输出),那么你很好。
    • “如果你的 StringBuilder 只存在于一个方法中”。局部变量存在于堆栈中。如果十个线程运行相同的方法,它们每个都会得到自己独立的“副本”。 (当然,如果您将引用传递到方法之外的某个地方,例如将其设置为对象字段,那么其他线程可能会获得该实例)。
    猜你喜欢
    • 2012-08-19
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 2012-10-09
    • 2012-02-18
    • 2013-01-30
    相关资源
    最近更新 更多