我正在尝试按空格分割JavaRDD的每个元素,除了引号和[]中的部分。我正在使用以下代码
SparkConf conf = new SparkConf().setAppName("LogAnalyzer");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String[]> logRdd = sc.textFile(logPath).map(new Function<String, String[]>() {
public String[] call(String s) {
return s.split("\\s+(?![^\\\\[]*\\\\])(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)");
}
});
for(String[] arr : logRdd.take(10)) {
for(String s : arr) {
System.out.print("| "+s+" |");
}
System.out.println("-------------------");
}
sc.close();
但是我在运行时遇到了这个错误
18/06/05 01:07:02 ERROR executor.Executor: Exception in task 0.0 in stage 0.0 (TID 0)
java.util.regex.PatternSyntaxException: Unclosed character class near index 49
\\s+(?![^\\[]*\\])(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)
^
当我在一个简单的java文件中使用它时,我没有得到这个
String[] splitted = s.split("\\s+(?![^\\[]*\\])(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)");
我需要在Spark中做些什么吗?如果需要更多信息,请告诉我。
答案 0 :(得分:2)
中还有两个
\\
public String[] call(String s) { return s.split("\\s+(?![^\\\\[]*\\\\])(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)"); }
应该是
public String[] call(String s) { return s.split("\\s+(?![^\\[]*\\])(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)"); }
答案 1 :(得分:0)
我在另一个主题中读到,对于正则表达式,为了包含],你需要在最后添加额外的]。像这样:
[^\"]]*$)");
我复制了你的代码而我正在获得#34;未公开的角色类&#34;来自IDE的错误。修改后,没有问题。虽然我不知道它是否会产生你想要的正则表达式结果。