2017-03-27 9 views
1

Ich habe einen Scala-Code gemacht und es sieht so aus.Scala - geschweifte Klammern Zeichenfolge fehlt

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

und nennen Sie diese Scala Jar-Datei aus Garn.

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

Wenn ich gesetzt json Zeichenfolge wie unten

{\ "aaa \": \ "A1111 \", \ "bbbb \": \ "B1111 \"}

ausdrucken unten (wie ich erwarten)

strJson: { "aaa": "A1111", "bbbb": "B1111"}

aber wenn ich gesetzt json Zeichenfolge wie unten

{\ "aaa \": \ "A1111 \", \ "bbbb \": \ "B1111 \", \ "ccc \": {\ "c1 \": \ "c111 \"}}

sie unterhalb

strJson drucken: { "aaa": "A1111", "bbbb": "B1111", "ccc" : {"c1": "c111"

Warum verschwinden alle geschlossenen geschweiften Klammern?


zusätzliche Probe

\ "{\" aaa \ "\ "A1111 \" \ "bbbb \" \ "B1111 \" \" ccc \ ": {\" c1 \ ": \" c111 \ "}} \"

strJson: "{" aaa ":" a1111 "," bbbb ":" b1111 "," ccc ": {" c1 ":" c111 ""

{\ "aaa \" \ "A1111 \" \ "bbbb \" \ "B1111 \" \ "ccc \": {\ "c1 \": \ "C111 \ "} a} strJson: {" aaa“: "A1111", "bbbb": "B1111", "ccc": { "c1": "c111"} a}

+0

ich denke, Ihre Shell Tricks auf Sie spielt. – pedrofurla

+0

Es ist vielleicht nicht, weil ich bekam Fehler, wenn JSON-String wird das Parsen und es gedruckt auf hadoop Protokoll. –

+0

Haben Sie versucht zu setzen ' "'um den String wie'?"{\ "Aaa \": \ "A1111 \", \ "bbbb \": \ "B1111 \", \ "ccc \": {\“ c1 \ ": \" c111 \ "}}" ' –

Antwort

1

Dieses Problem tritt wegen der Art und Weise GARN versucht Parameter Expansion Marker zu ersetzen {{ und }} in Ihrem Befehl mit Verweisen auf Umgebungsvariablen.

Wenn Sie beispielsweise run_job.sh {{MY_VARIABLE}} an YARN übergeben, wird es in run_job.sh $MY_VARIABLE konvertiert, sodass die Umgebungsvariable verwendet wird.

Dieses Problem tritt auf, wenn Sie JSON (oder andere Dinge mit zwei geschweiften Klammern nebeneinander) mit verschachtelten Objekten in der Befehlszeile haben. Dies geschieht nur, wenn Sie GARN als Master und Cluster-deploy-Modus verwenden. Funkenstandalone und GARN-Client-Modus sind nicht betroffen.

Um dieses Problem zu beheben, verwenden Sie entweder ein anderes Datenformat als JSON oder stellen Sie sicher, dass Sie nicht zwei geschweifte Klammern nebeneinander haben.

Zum Beispiel mit Python Sie schnell dieses Problem wie dieses Problem beheben könnte:

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("{{", "{ {") 

Sie können sehen, die problematische GARN Code hier:

@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; 
    } 

Siehe Ticket für das Problem hier: https://issues.apache.org/jira/browse/SPARK-17814

1

ich glaube, du verpasst die Anführungszeichen in Anfang und Ende der Zeichenfolge. Bitte versuchen Sie es mit doppelten Anführungszeichen als

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

immer noch gleich.}} ist als leer repassiert. –

0

Warum dreifache Anführungszeichen nicht verwenden?

"" "{ "aaa": "A1111", "bbbb": "B1111", "ccc": { "c1": "c111"}} """

Es ist alles viel einfacher, Lesen Sie und lösen Sie Ihr Problem.

+0

immer noch gleich.}} ist als leer repaled. –

0

ich immer noch nicht sicher, warum dies geschieht, aber mit Zusatz ‚Raum‘ zwischen geschweiften Klammern gelöst wie unten kann.

}} ->}}

Verwandte Themen