1

我尝试从这本打开的书中获取有关地图匹配工作的示例。我正在使用 scala 2.10 和 spark 2.0.2。

不幸的是,语法和功能发生了变化。

case class NodeEntry(nodeId: Long, latitude: Double, longitude: Double, tags: Array[String])

val nodeDS = nodes.map{node => 
NodeEntry(node.getId, 
   node.getLatitude, 
   node.getLongitude, 
   node.getTags.map(_.getValue).toArray
)}.toDS.cache

我收到错误“值映射不是 java.util.List [org.openstreetmap.osmosis.core.domain.v0_6.WayNode] 的成员”

和“值 toDS 不是 scala.collection.mutable.ArrayBuffer[Nothing] 的成员可能的原因:在 `value toDS' 之前可能缺少分号?”

我试图将 nodes.map 更改为以下内容:

val nodeDS = nodes.map { node => 
  NodeEntry(node.getId, 
      node.getLatitude, 
      node.getLongitude, 
      node.getTags.toArray() 
  )}

但后来我得到这个错误:类型不匹配;found : Array[Object] required: Array[String] 注意:Object >: String,但类 Array 在类型 T 中是不变的。您可能希望研究通配符类型,例如 _ >: String。(SLS 3.2.10)

4

2 回答 2

1

啊,我明白了。在建议的导入之后,以下工作:

val nodeDS = nodes.map { node => 
  NodeEntry(node.getId, 
      node.getLatitude, 
      node.getLongitude, 
      node.getTags.map(_.getValue).toArray
  )}
于 2016-12-08T11:43:55.527 回答
0

map在 Java 集合上不可用,以使其可用import JavaConversions

import scala.collection.JavaConversions._

例子

斯卡拉 REPL

scala> val l = new java.util.ArrayList[String]()
l: java.util.ArrayList[String] = []

scala> l.add("scala")
res0: Boolean = true

scala> l.add("haskell")
res1: Boolean = true

scala> l.map(x => x.reverse)
<console>:13: error: value map is not a member of java.util.ArrayList[String]
       l.map(x => x.reverse)
     ^

scala> import scala.collection.JavaConversions._
import scala.collection.JavaConversions._

scala> l.map(x => x.reverse)
res3: scala.collection.mutable.Buffer[String] = ArrayBuffer(alacs, lleksah)

请注意,在导入地图后,java ArrayList 上现在可用

于 2016-12-08T10:08:00.587 回答