Scala - 缺少大括号字符串

时间:2017-03-27 07:56:00

标签: json scala apache-spark yarn curly-braces

我制作了一些scala代码,它看起来像这样。

object myScalaApp {
    def main(args: Array[String]) : Unit = {
        val strJson = args.apply(0)
        println( "strJson : " + strJson)

并从yarn调用此scala jar文件。

Process spark = new SparkLauncher()
.setAppResource("/usr/local/myJar/myApp.jar")
.setMainClass("com.myScalaApp")
.setMaster("yarn")
.setDeployMode( "cluster")
.addAppArgs( data)
.launch();

当我设置如下的json字符串时

  

{\“aaa \”:\“a1111 \”,\“bbbb \”:\“b1111 \”}

它打印在下面(正如我所料)

  

strJson:{“aaa”:“a1111”,“bbbb”:“b1111”}

但是我在下面设置了json字符串

  

{\“aaa \”:\“a1111 \”,\“bbbb \”:\“b1111 \”,\“ccc \”:{\“c1 \”:   \ “C111 \”}}

它打印在

下面
  

strJson:{“aaa”:“a1111”,“bbbb”:“b1111”,“ccc”:{“c1”:“c111”

为什么所有关闭的花括号都会消失?

额外样本

1

  

\“{\”aaa \“:\”a1111 \“,\”bbbb \“:\”b1111 \“,\”ccc \“:{\”c1 \“:   \ “C111 \”}} \“

     

strJson:“{”aaa“:”a1111“,”bbbb“:”b1111“,”ccc“:{”c1“:”c111“”

2

  

{\“aaa \”:\“a1111 \”,\“bbbb \”:\“b1111 \”,\“ccc \”:{\“c1 \”:   \ “C111 \”} A}   strJson:{“aaa”:“a1111”,“bbbb”:“b1111”,“ccc”:{“c1”:“c111”} a}

4 个答案:

答案 0 :(得分:5)

出现此问题的原因是YARN尝试使用对环境变量的引用替换命令中的参数扩展标记{{}}

例如,如果您将run_job.sh {{MY_VARIABLE}}传递给YARN,它会将其转换为run_job.sh $MY_VARIABLE,以便使用该环境变量。

因此,如果您在命令行中使用嵌套对象的JSON(或其他具有两个花括号的东西),则会发生此问题。仅当您使用YARN作为主集群部署模式时才会发生这种情况。 Spark独立和YARN客户端模式不受影响。

要解决此问题,请使用除JSON之外的其他数据格式,或确保您没有彼此相邻的两个花括号。

例如,使用Python,您可以快速解决此问题:

def fix_json_for_yarn(json_string):
    # See https://issues.apache.org/jira/browse/SPARK-17814
    # Due to that YARN bug we need to make sure that our json string
    # doesn't contain {{ or }} because those get replaced by YARN.
    return json_string.replace("}}", "} }").replace("{{", "{ {")

您可以在此处查看有问题的YARN代码:

  @VisibleForTesting
  public static String expandEnvironment(String var,
      Path containerLogDir) {
    var = var.replace(ApplicationConstants.LOG_DIR_EXPANSION_VAR,
      containerLogDir.toString());
    var =  var.replace(ApplicationConstants.CLASS_PATH_SEPARATOR,
      File.pathSeparator);

    // replace parameter expansion marker. e.g. {{VAR}} on Windows is replaced
    // as %VAR% and on Linux replaced as "$VAR"
    if (Shell.WINDOWS) {
      var = var.replaceAll("(\\{\\{)|(\\}\\})", "%");
    } else {
      var = var.replace(ApplicationConstants.PARAMETER_EXPANSION_LEFT, "$");
      var = var.replace(ApplicationConstants.PARAMETER_EXPANSION_RIGHT, "");
    }
    return var;
  }

请在此处查看问题单:https://issues.apache.org/jira/browse/SPARK-17814

答案 1 :(得分:1)

我认为你错过了字符串开头和结尾的双引号。 请尝试使用双引号

"{\"aaa\" : \"a1111\",\"bbbb\" : \"b1111\",\"ccc\" : {\"c1\" : \"c111\"} }";

答案 2 :(得分:0)

为什么不使用三重报价?

""" {" AAA" :" a1111"," bbbb" :" b1111"," ccc" :{" c1" :" c111"}}"""

它更容易阅读,并将解决您的问题。

答案 3 :(得分:0)

我仍然不确定为什么会发生这种情况,但可以通过增加的空间来解决这个问题。在下面的大括号之间。

  

}} - > }}