【问题标题】:String Split Error字符串拆分错误
【发布时间】:2018-06-05 08:11:59
【问题描述】:

我试图用空格分割 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 中做其他事情吗?如果需要更多信息,请告诉我。

【问题讨论】:

    标签: java apache-spark rdd


    【解决方案1】:

    你有两个额外的\\

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

    应该是

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

    【讨论】:

      【解决方案2】:

      我在另一个主题中读到,对于正则表达式,为了包含 ],您需要在末尾添加额外的 ]。像这样:

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

      我复制了您的代码,但从 IDE 收到“未关闭的字符类”错误。修改后,没有任何问题。虽然我不知道它是否会产生你想要的正则表达式结果。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 2014-10-15
      • 1970-01-01
      相关资源
      最近更新 更多