我从HDFS中读取了一个文件,该文件包含在JTS中表示envelope的x1,x2,y1,y2。
我想使用这些数据在foreach中构建STRtree。
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方法在这里没有任何意义。
顺便说一下,如果我逐行编写一些测试数据的硬代码,就可以很好地构建strtree。
还有一件事,这些项目被打包到jar中并在spark-shell中提交。
那么,为什么foreach中的方法不起作用呢?
发布于 2015-03-19 16:34:58
您将必须使用collect()来完成此操作:
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)
}发布于 2015-03-19 16:08:59
使用.map()代替.foreach()并重新分配结果。
Foreach不返回应用函数的结果。它可以用来将数据发送到某个地方,存储到数据库,打印等等。
https://stackoverflow.com/questions/29138425
复制相似问题