Scala函数不返回值

时间:2015-05-19 03:11:32

标签: scala apache-spark

我认为我理解隐式回报的规则,但我无法弄清楚为什么没有设置splithead。此代码通过

运行
val m = new TaxiModel(sc, file) 

然后我期待

m.splithead

给我一​​个数组字符串。注意head是一个字符串数组。

import org.apache.spark.SparkContext
import org.apache.spark.rdd.RDD

class TaxiModel(sc: SparkContext, dat: String) {
  val rawData = sc.textFile(dat)

  val head = rawData.take(10)
  val splithead = head.slice(1,11).foreach(splitData)

  def splitData(dat: String): Array[String] = {
    val splits = dat.split("\",\"")
    val split0 = splits(0).substring(1, splits(0).length)
    val split8 = splits(8).substring(0, splits(8).length - 1)
    Array(split0).union(splits.slice(1, 8)).union(Array(split8))
  }
}

2 个答案:

答案 0 :(得分:4)

foreach只是评估表达式,并且在迭代时不收集任何数据。您可能需要mapflatMap(请参阅文档here

head.slice(1,11).map(splitData) // gives you Array[Array[String]]

head.slice(1,11).flatMap(splitData) // gives you Array[String]

答案 1 :(得分:1)

还要考虑理解(在这种情况下将 desugars 转换为flatMap),

for (s <- head.slice(1,11)) yield splitData(s)

另请注意,Scala字符串配有有序集合方法,因此

splits(0).substring(1, splits(0).length)

证明等同于以下任何一种

splits(0).drop(1)
splits(0).tail