我通过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
答案 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字符。