spark + scala + sql+graphx 的版本一致性的坑
1)
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_${scala.binary.version}</artifactId>
<version>${spark.version}</version>
<exclusions>
2)
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_${scala.binary.version}</artifactId>
<version>2.1.0</version>
</dependency>
3)
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-graphx_${scala.binary.version}</artifactId>
<version>${spark.version}</version>
</dependency>
这些个地方都要一致,不然就会出现
java.lang.NoSuchMethodError: scala.Predef$.ArrowAssoc(Ljava/lang/Object;)
等等各种错误。
在使用spark graphx 的mapEdge 和mapVertices的时候。
我们使用了 def a(a:vertex) ={}
这种方式,然后 执行 mapEdge 的时候,
Caused by: java.io.NotSerializableException: com.datayes.quantgraph.spark.SpkQuantGraph
Serialization stack:
- object not serializable (class: com.datayes.quantgraph.spark.SpkQuantGraph, value: com.datayes.quantgraph.spark.SpkQuantGraph@79392584)
- field (class: $iw, name: mygraph, type: class com.datayes.quantgraph.spark.SpkQuantGraph)
- object (class $iw, $iw@51b1732d)
- field (class: $iw, name: $iw, type: class $iw)
- object (class $iw, $iw@6d4f1a44)
- field (class: $iw, name: $iw, type: class $iw)
- object (class $iw, $iw@5ceb6796)
序列化的错误,通常就是 函数没有实现序列化接口。
但是奇怪的是,我们换了一种写法就是可以的。
比如 val a : (Int => Boolean) = (_ % 2 == 0)
原来, val 和def 来定义一个函数。在scala 中是有区别的。
https://blog.csdn.net/weixin_41705780/article/details/79268963
val 这种定义lambda函数,是实现了Function接口。
这个FUnction接口是默认可以序列化的。而graphx
的mapEdge 和mapVertex函数, 需要接收一个 Function对象。
所以 必须使用lambda的写法。
网友评论