我有一个存储在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;
}
});
答案 0 :(得分:1)
所以,问题在于这一行:
List<String> temp = Arrays.asList(ip.split("."));
由于split()
方法可以将正则表达式作为输入,因此当使用点(.
)作为输入时,该方法将其视为正则表达式而不是实际字符。
您需要做的是转义点字符以告诉方法将点视为字符。
替换此行:
List<String> temp = Arrays.asList(ip.split("."));
这一行:
List<String> temp = Arrays.asList(ip.split("\\."));
其中:
第一个\
将转义以下字符,即第二个\
,因为斜杠也是正则表达式字符
第二个\
意味着转义以下字符,即.
.
是要转义的字符