我是scala的新手。 我们可以在scala中动态添加/附加数据到List或任何其他集合。
我的意思是我们可以使用foreach(或任何其他循环)在List或任何集合中添加数据。
我正在尝试做类似下面的事情:
var propertyData = sc.textFile("hdfs://ip:8050/property.conf")
var propertyList = new ListBuffer[(String,String)]()
propertyData.foreach { line =>
var c = line.split("=")
propertyList.append((c(0), c(1)))
}
假设 property.conf 文件包含:
" spark.shuffle.memoryFraction" =" 0.5"
" spark.yarn.executor.memoryOverhead" =" 712"
编译正常但是ListBuffer中没有添加值。
答案 0 :(得分:1)
是的,可以使用可变集合(参见this link),例如:
import scala.collection.mutable
val buffer = mutable.ListBuffer.empty[String]
// add elements
buffer += "a string"
buffer += "another string"
或循环:
val buffer = mutable.ListBuffer.empty[Int]
for(i <- 1 to 10) {
buffer += i
}
答案 1 :(得分:1)
我尝试使用他(更新)问题中的Darshan代码:
val propertyData = List(""""spark.shuffle.memoryFraction"="0.5"""", """"spark.yarn.executor.memoryOverhead"="712" """)
val propertyList = new ListBuffer[(String,String)]()
propertyData.foreach { line =>
val c = line.split("=")
propertyList.append((c(0), c(1)))
}
println(propertyList)
它按预期工作:它打印到控制台:
ListBuffer(("spark.shuffle.memoryFraction","0.5"), ("spark.yarn.executor.memoryOverhead","712" ))
我没有在Spark上下文中这样做,尽管我会在几分钟内尝试一下。所以,我在字符串列表中提供了数据(不应该有所作为)。我也改变了&#34; var&#34;关键词&#34; val&#34;因为它们都不需要是一个可变变量,但当然这也没有区别。代码无论是val还是var。
请参阅下面的评论。但这里有惯用的Spark / Scala代码,它的行为完全符合您的预期:
object ListTest extends App {
val conf = new SparkConf().setAppName("listtest")
val sc = new SparkContext(conf)
val propertyData = sc.textFile("listproperty.conf")
val propertyList = propertyData map { line =>
val xs: Array[String] = line.split("""\=""")
(xs(0),xs(1))
}
propertyList foreach ( println(_))
}
答案 2 :(得分:0)
您可以使用可变集合(非功能性),也可以返回新集合(功能性和更具惯用性),如下所示:
scala> val a = List(1,2,3)
a: List[Int] = List(1, 2, 3)
scala> val b = a :+ 4
b: List[Int] = List(1, 2, 3, 4)