spark应用程序开发总结

1.静态变量取不到值,报空指针异常
出现这种情况主要原因: rdd的操作中去读取配置文件中的值,如:
public static float col1= Float.valueOf(RESOURCE_BUNDLE.getString("col1"));
解决办法:把操作rdd的方法抽取到一个单独的类中,让该类实现序列化接口,把变量通过构造函数或者函数参数传到该类中。
2.spark sql,字段值为null时使用row.getAs方法报异常

取值时使用row.get(index),例如:

if (row.get(3) == null){
    double field1 = -1;
}else{
    double field1 = row.getAs("field1");
    ...
}

 3.Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class

经检查,类是存在的,可能是在类A静态变量初始化时报异常导致类A加载时报异常,所以其他类找不到类A。
4. 静态变量引用其他类的静态变量,出现空指针异常
可以尝试让最终的调用者在使用时再去调用,即不在静态变量初始化时去调用另外类的静态变量。

5.rdd.cache()

需要多处使用的rdd,要cache起来, 分区过多的,要重新分区下,分区适当改小点。

6.spark sql group by之后进行join操作速度慢

先将待处理的rdd中的对象先根据各个需要group by的字段排序,再使用spark sql关联统计。
比如需要根据field1, field2, field3 group by,可以先对rdd根据field1,field2, field3排序,然后
把rdd注册成临时表进行统计关联,在我的程序中按照这种方式这样优化之后,速度提升了10倍。

if (row.get(3) == null){
    double field1 = -1;
}else{
    double field1 = row.getAs("field1");
    ...
}

猜你喜欢

转载自albert2012.iteye.com/blog/2412855
今日推荐