Apache-Spark:foreach中的方法不起作用

时间:2015-03-19 06:28:27

标签: scala apache-spark jts

我从HDFS读取文件,其中包含代表JTSx1,x2,y1,y2的{​​{1}}。

我想使用这些数据在envelope中构建STRtree

foreach

如您所见,我还打印val inputData = sc.textFile(inputDataPath).cache() val strtree = new STRtree inputData.foreach(line => {val array = line.split(",").map(_.toDouble);val e = new Envelope(array(0),array(1),array(2),array(3)) ; println("envelope is " + e); strtree.insert(e, new Rectangle(array(0),array(1),array(2),array(3)))}) 对象。

令我惊讶的是,当我记录e的大小时,它为零!似乎strtree方法在这里没有任何意义。

顺便说一下,如果我逐行编写一些测试数据的硬编码,insert可以很好地构建。

还有一件事,那些项目被打包到jar中并在strtree中提交。

那么,为什么spark-shell中的方法不起作用?

2 个答案:

答案 0 :(得分:0)

使用.map()而不是.foreach()并重新分配结果。

Foreach不会返回应用函数的结果。它可用于在某处发送数据,存储到db,打印等。

答案 1 :(得分:0)

您必须收集()才能执行此操作:

inputData.collect().foreach(line => {
 ... // your code
})

您可以执行此操作(以避免collect所有数据):

val pairs = inputData.map(line => {
    val array = line.split(",").map(_.toDouble);
    val e = new Envelope(array(0),array(1),array(2),array(3)) ;
    println("envelope is " + e);
    (e, new Rectangle(array(0),array(1),array(2),array(3)))
}

pairs.collect().foreach(pair => {
    strtree.insert(pair._1, pair._2)
}