java操纵spark遇到的问题

版权声明:本文为博主原创文章,欢迎随意转载。 https://blog.csdn.net/u013897685/article/details/52891150

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;
                };
            });
......
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页