Spark JavaRDD - 函数不返回值

时间:2016-07-03 09:09:11

标签: java function apache-spark

我有一个存储在JavaRDD中的IP列表作为字符串列表 logLine : [[54.186.7.47],[178.154.189.203],[10.55.1.29],[115.93.74.252]]

我运行下面代码的一部分来创建带有整数列表的新JavaRDD - 由每个IP的4个八位字节的总和组成(即95.5表示10.55.1.29)。

但是当我运行ipSplit.collect()时,我收到[[0],[0],[0],[0]]。我的代码出了什么问题? :)

JavaRDD<List<Integer>> ipSplit = logLine.map(new Function<List<String>, List<Integer>>() {
       public List<Integer> call(List<String> s) {
            List<Integer> ipNumbers = new ArrayList<Integer>();
            for (String ip : s) {
                List<String> temp = Arrays.asList(ip.split("."));
                int summary = 0;
                for (String octet : temp) {
                    //System.out.println("octet: " + octet);
                    summary = summary + Integer.parseInt(octet);
                }
                ipNumbers.add(summary);
            }
           return ipNumbers; 
    }
   }); 

1 个答案:

答案 0 :(得分:1)

所以,问题在于这一行:

List<String> temp = Arrays.asList(ip.split("."));

由于split()方法可以将正则表达式作为输入,因此当使用点(.)作为输入时,该方法将其视为正则表达式而不是实际字符。

您需要做的是转义点字符以告诉方法将点视为字符。

替换此行:

List<String> temp = Arrays.asList(ip.split("."));

这一行:

List<String> temp = Arrays.asList(ip.split("\\."));

其中:

  • 第一个\将转义以下字符,即第二个\,因为斜杠也是正则表达式字符

  • 第二个\意味着转义以下字符,即.

  • .是要转义的字符