我从HDFS
读取文件,其中包含代表JTS中x1,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
中的方法不起作用?
答案 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)
}