spark map操作使用类中定义的方法、变量出现NullpointException或Task not serializable问题解决

      spark 计算应用,我们经常使用map、filter、flatmap转换计算,但spark standalone 模式或其他yarn、mesos分布式计算,若要引用其他对象或共享变量,需要用支持Serializable序列化,或使用broadcast定义变量,这样在spark task并发下就可以在多个不同节点的excutor执行正确运算。

      在local 模式,map计算运用类中的某个方法(必须 static 方法)是不会报task not serializable问题。但在其他模式就出错NullPointException,或Task not serializable。这个时候,这个方法需要放到一个可序列化(implements serializable )的类中,并且变成类中的一个方法。实例化这个类对象,进行广播即可。

       示例:

import scala.reflect.ClassTag;
        ClassTag<Geo> classTagTest = scala.reflect.ClassTag$.MODULE$.apply(Geo.class);
        Broadcast<Geo> broadcastTest = sparkSession.sparkContext().broadcast(new Geo(cityPath), classTagTest);

在map方法里,调用broadcastTest.value().类中的方法即可。

猜你喜欢

转载自blog.csdn.net/aa5305123/article/details/81662111