spark框架是用scala语言编写的。网上关于用java操控spark的资料很少,Demo基本上都是在main方法里面操作spark。现有需要将spark分析用java写成接口,定时调用。过程中遇到很多困难。
- task not serializable
@Service
public class ConfirmGenderService implements java.io.Serializable{
@Autowired
private transient ImeiInfoConfirmService imeiInfoConfirmService;
.........
JavaRDD<String[]> filtered = records.filter(new Function<String[], Boolean>() {
@Override
public Boolean call(String[] rec) throws Exception {
String info = rec[0];
String imei = rec[1];
rec[0] = imei;
if ("1".equals(type)) {
rec[1] = imeiInfoConfirmService.confirmSex(info) + "";
} else if ("2".equals(type)) {
rec[1] = imeiInfoConfirmService.confirmSexByPackage(info) + "";
}
if ("-1".equals(rec[1])) {
return false;
}
return true;
};
});
报ConfirmGenderService不能序列化,因为在filter中使用了外面定义的imeiInfoConfirmService变量,而此变量不能序列化。然后给ImeiInfoConfirmService实现了java.io.Serializable接口。
@Service
public class ImeiInfoConfirmService implements Serializable{
@Autowired
private DetailIdInfoDAO detailIdInfoDAO;
接着报DetailIdInfoDAO不能序列化,为DetailIdInfoDAO接口继承了java.io.Serializable接口。还是报错,最后在detailIdInfoDAO变量前加了个transient修饰词就OK了。
关于:transient的学习
- 运行时调用接口,imeiInfoConfirmService报空指针异常。原因匿名内部类@autowired注解没起作用。
最后解决方法:在ConfirmGenderService内@Autowired获取实例定义成全局变量同时transient修饰,然后再filter里面用局部变量接收全局变量值。接口就可以正确调用了。
@Service
public class ConfirmGenderService implements java.io.Serializable{
private static final long serialVersionUID = 1280990368721123215L;
@Autowired
private transient ImeiInfoConfirmService imeiInfoConfirmService;
@SuppressWarnings("serial")
public void statisticsAnalysis(String input, String output, final String type) {
SparkConf conf = new SparkConf().setAppName("Test").setMaster("local");
JavaSparkContext sc = new JavaSparkContext(conf);
......
JavaRDD<String[]> filtered = records.filter(new Function<String[], Boolean>() {
private ImeiInfoConfirmService service = imeiInfoConfirmService;
@Override
public Boolean call(String[] rec) throws Exception {
String info = rec[0];
String imei = rec[1];
rec[0] = imei;
if ("1".equals(type)) {
rec[1] = service.confirmSex(info) + "";
} else if ("2".equals(type)) {
rec[1] = service.confirmSexByPackage(info) + "";
}
if ("-1".equals(rec[1])) {
return false;
}
return true;
};
});
......
border="0" width="330" height="86" src="http://music.163.com/outchain/player?type=2&id=110215&auto=1&height=66">