我认为我理解隐式回报的规则,但我无法弄清楚为什么没有设置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))
}
}
答案 0 :(得分:4)
foreach
只是评估表达式,并且在迭代时不收集任何数据。您可能需要map
或flatMap
(请参阅文档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