java操纵spark遇到的问题

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">
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值