在scala中动态添加数据到列表或任何其他集合

时间:2016-09-19 13:06:22

标签: scala

我是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中没有添加值。

3 个答案:

答案 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)