1

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

1 回答 1

1

两者之间的唯一区别StringBuffer具有synchronized方法(这是您几乎从不需要的东西)。所以保留valueString一个局部变量并使用StringBuilder.

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

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

于 2017-05-14T07:42:29.093 回答