2016-05-03 10 views
-1

Ich versuche, alle eindeutigen Werte eines Spark RDD, durch Komma trennen. Dies ist mein Code:Foreach auf einem RDD distinct funktioniert nicht

def genPredicateIn(data: RDD[String], attribute: String): String = { 
    var s: String = attribute + " in {" 
    val distinct = data.distinct 
    distinct.foreach(s += ", " + _) 
    s += "}" 
    s 
} 

Aber es gibt mir nur "attribute in {}", warum? Was ist mein Fehler?

Es funktioniert, wenn ich val array <- data.distinct.collect schreibe und darauf iterieren. Warum?

+0

Wenn das funktioniert, dann würden Sie 'attribute in {, data1, data2}} trotzdem bekommen –

+0

ja, das ist nicht mein Problem –

+1

Ich glaube nicht, dass ein Lambda eine Zuweisung enthalten kann. Warum können Sie die RDD nicht sammeln und dann die Verbindung herstellen? Das ist im Wesentlichen das, was du ohnehin tust. Der Grund, warum Sie keine Zuweisung durchführen können, ist, dass Spark Ihre Zeichenfolge nicht an alle Worker-Knoten übergeben und sie mit den Partitionen von Daten verketten kann. –

Antwort

1

Wenn ich ein ähnliches Beispiel auf PySpark führe, bekomme ich "Lambda kann keine Zuweisung enthalten", also nehme ich an, dass Scala genauso funktionieren würde.

Sie sollten collect die RDD, und dann die Komma-Join tun können. Das ist im Wesentlichen das, was du ohnehin tust.

Der Grund dafür, dass Sie keine Zuweisung durchführen können, ist, dass Spark die Zeichenfolge nicht an alle Worker-Knoten übergeben und diese mit den verschiedenen Datenpartitionen verketten kann, um das Ergebnis wieder an den ausgeführten Code zu übergeben.

Verwandte Themen