当通过oozie传递给spark程序时,Pattern.quote不能用于\ 037字符

时间:2017-05-19 18:21:42

标签: java oozie

我通过oozie将ASCII字符\ 037(用作字段分隔符)传递给spark程序。在我的oozie属性文件中,我给出了像

这样的值

delimitterArg = \\ 037

在我的火花程序中,我试图将线分割如下

public static void main(String[] args){
    String column1 =     line.split(Pattern.quote(args[0]));                    
}

但它不起作用。但如果我使用没有Pattern.quote它正在工作,

public static void main(String[] args){
   String column1 =     line.split(args[0]));                               
 }

我想使用Pattern.quote(),因为它会处理像Pipe(|)这样的特殊字符。有什么建议吗?

编辑: 这是我的完整情景

我需要将分隔符\ 037传递给通过oozie job触发的spark程序。我将使用它作为字段分隔符来处理数据。

为了将\ 037传递给spark程序,我必须在job.properties文件中给出\\ 037。

现在我已经在我的spark程序中收到了这个值并尝试拆分输入字符串。问题是那个

String column1 =  line.split(Pattern.quote(args[0])); // Not Working


String column1 =  line.split(args[0])); // Working 

1 个答案:

答案 0 :(得分:1)

我怀疑你传递给Pattern.quote()的字符串不是你想要的字符串。

这是一个测试程序:

public class MVCE
    {
    public static void main(String[] argv)
        {
        final String line = "ab\037cd\037ef";
        final String[] columns = line.split( Pattern.quote("\037") );
        System.out.println(Arrays.toString(columns));
        }
    }

该程序的输出是:

[ab, cd, ef]

我会通过在main()方法的开头添加print语句来调试您的情况,以便您可以确切地看到传递的字符串为args[0]。我对oozie一无所知,但我注意到你在其文件中显示\\037作为值。也许您有多个级别的程序以各种方式解释字节,使得配置文件中的五个字节(如果它是ASCII或UTF-8)不会导致args[0]中的预期/预期的四个Unicode字符。