Ошибка разделения строки - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь разбить каждый элемент 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+(?![^\\[]*\\])(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)
                                             ^

Я не получаю это, когда я использую это в простой Javafile

String[] splitted = s.split("\\s+(?![^\\[]*\\])(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)");

Нужно ли что-то еще делать в Spark?Пожалуйста, дайте мне знать, если требуется дополнительная информация.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Я читал в другой теме, что для регулярного выражения, чтобы включить], вам нужно добавить дополнительные] в конце.например:

    [^\"]]*$)");

Я продублировал ваш код и получил ошибку "Класс закрытых символов" из IDE.После модификации проблем не было.Хотя я не знаю, даст ли он результат регулярного выражения, который вы хотели.

0 голосов
/ 05 июня 2018

У вас есть два дополнительных \\ в

public String[] call(String s) { return s.split("\\s+(?![^\\\\[]*\\\\])(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)"); }

, которые должны быть

public String[] call(String s) { return s.split("\\s+(?![^\\[]*\\])(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)"); }
...