2017-10-13 4 views
1

Hier ist ein Beispiel.Gibt es eine gute Möglichkeit, Wörter in Spark anzuhängen?

DataSet - dataset.txt

1 banana kiwi orange melon

-Code

scala> val table = sc.textFile("dataset.txt").map(_.split(" ")) 

scala> table.take(1) 

res0: Array[Array[String]] = Array(Array(1, banana , kiwi , orange, melon)) 

scala> val pairSet = table.map{case Array(key,b,k,o,m) => (key, b+" "+k+" "+o+" "+m)} 

scala> pairSet.take(1) 

res1: Array[(String, String)] = Array((1, banana kiwi orange melon)) 

Ich frage mich, ob der Teil, der die Werte in der pairSet anhängt effizient ist. Oder gibt es einen besseren Weg?

Antwort

1

können Sie nach dem ersten Auftreten von Raum teilen & erstellen key & value daraus.

val table = sc.textFile("dataset.txt").map { x => 
    val splits = x.split(" ",2) 
    (splits(0), splits(1)) 
} 
+0

Vielen Dank für Ihre Antwort! Ist Ihre Methode (val splits = x.split ("", 2) (Splits (0), Splits (1))) "effizienter als mein Verfahren" (b + "+ k +" + o + "" + m) '? –

+0

ja, denn in Ihrem Fall spalten Sie die restlichen Strings mit Ausnahme des ersten Vorkommnisses unnötig auf, um sie später wieder anzuhängen. – vdep

+0

Oh ja! Vielen Dank für Ihren Rat! –

1

Ihr Ansatz für die Logik funktioniert nur, wenn das Array immer die gleiche Menge an Daten enthält. Sie können dies auch versuchen.

Wenn Sie dies verwenden, beschränken Sie das Array nicht auf eine feste Größe nach dem Teilen.

Hoffe, das funktioniert gut für Sie.

Danke

+0

Vielen Dank für Ihre Antwort! Ist Ihre Methode (val array = line.split ("", 2) (Array (0), Array (1))) "effizienter als mein Verfahren" (b + "+ k +" + o + "" + m) '? –

+0

Ja, weil [loop] aufhört, den Wert zu teilen, nachdem er das erste Leerzeichen erhalten hat. –

+1

Oh ja! Vielen Dank für Ihren Rat! –

Verwandte Themen