2017-01-17 5 views

Antwort

1

Wenn das, was Sie versuchen, ein CSV in einen Datenrahmen zu laden, zu tun ist, gibt es einen einfacheren Weg:

val dataframe: DataFrame = spark.read.csv("file.text") 

Alternativ, wenn Sie bei der Umwandlung ein RDD[String] in wirklich interessiert sind ein RDD[Row] - hier ist, wie Sie das tun würde:

val rows: RDD[Row] = textLines.map(_.split(",")).map { 
    a: Array[_] => Row(a: _*) 
} 

Aber beachten Sie, dass dies „uneben“ Zeilen erstellen (wenn Ihre Daten keine richtige CSV ist, unterschiedliche Zeilen mi ght haben unterschiedliche Anzahl von Spalten, die diese RDD ziemlich unbrauchbar machen würde).

1

Karte ist eine Funktionsfunktion höherer Ordnung. Der Rückgabewert ist die die Art, auf dem Sie die Anwendung Map-Funktion immer eingewickelt

Beispiel: -. List ("Antwort", "Frage", "Stackoverflow") Karte (x => x.length)

Dann ist diese map-Funktion auf String-Wert angewandt, sondern gibt den Int Wert aber dies wird auf Liste gewickelte dh List[String] => List[Int]

hier Ihre Karte auf textLines angewandt wird, das ist der Typ RDD [Zeichenfolge] Dann haben Sie angewandte Karte über RDD[String], diezurückgeben nicht Array[String]

Sie müssen nur verwenden sammeln() -Methode wie;

val textLines = spark.sparkContext.textFile("file.txt") 
val wordsArray = textLines.flatMap(_.split(",")).collect 
val rowRDD = Row.fromSeq(wordsArray) 

Ich verwende collect() Methode, wird gelangen Sie zurück Array[String] und ich bin mit flatMap statt map weil flatMap den Wert Flacht sonst auf Collect() Sie Array[Array[String]] erhalten Sie Karte verwenden können, wenn es Ihr Szenario passt .

Hope this lösen Ihr Problem

0

ich auch würde fragen, warum du so eine Reihe von Textdatei erstellen möchten? Da Sie eine CSV-Datei analysieren, würde Ihnen vielleicht spark-csv helfen, auf einer höheren Ebene zu arbeiten.

Verwandte Themen