我正在尝试从课堂上的HDFS读取一个普通文件,我将通过spark-submit执行。
我有一个执行String操作的方法,我从这个字符串输出创建RDD。
我在创建RDD之前执行以下字符串操作。
我应该将StringBuilder或StringBuffer用于变量valueString吗?
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"));
}
}
}
答案 0 :(得分:1)
only difference between the two是StringBuffer
有synchronized
种方法(这是你几乎不需要的)。因此,请将valueString
保留为局部变量,然后使用StringBuilder
。
的valueString = valueString.concat(trimmedLine.concat( “\ n”));
这种代码让我想知道你是否想要连接一个多行字符串。也许您可以使用行列表生成RDD,并将一些当前预处理移动到Spark作业本身?