2016-09-28 4 views
0

zu Datenrahmen Unter der Annahme, ich folgende rdd habe:Funken: Format eines rdd zu konvertieren

val rdd = sc.parallelize(Seq(('a'.toString,1.1,Array(1.1,2.2),0), 
          ('b'.toString,1.5,Array(1.4,4.2),3), 
          ('d'.toString,2.1,Array(3.3,7.4),4))) 

>>>rdd: org.apache.spark.rdd.RDD[(String,Double,Array[Double],Int)] 

Und ich möchte, um die Ausgabe zu csv Format schreiben von .write.format("com.databricks.spark.csv"), der zu einem Datenrahmen nimmt.

Also zuerst muss ich das aktuelle Schema zu konvertieren ->rdd[(String, String, String, String, String)] und nach der Konvertierung in df. Ich habe versucht, die folgenden:

rdd.map { case((a,b,c,d)) => (a,b,c.mkString(","),d)} 

aber diese Ausgänge:

rdd[(string,double,string,int)] 

eine Ahnung, wie es zu tun?

+1

Es gibt eine Bibliothek für diesen Zweck [spark-csv] (https://github.com/databricks/spark-csv/), die für Versionen vor 2.0 funktioniert. –

Antwort

0

UPDATE

mit Tupeln umgehen, müssen Sie wissen, wie viele Elemente, die Sie in ihnen ablegen werden und den Anwendungsfall selbst zu definieren. Um mit einer variablen Anzahl von Elementen arbeiten zu können, müssen Sie wahrscheinlich mit einer Sammlung arbeiten. Für Ihren Anwendungsfall kann so etwas wie dies funktioniert:

rdd.map { case((a,b,c,d)) => a +: (b +: c) :+ d}.map(_.mkString(",")) 

Dies in einer RDD[String] entsprechend jeder Zeile der CSV-Datei führen. Sie gehen vor und fügen die anderen Elemente an die Array "c" an, um eine einzelne Array zu ergeben.

+0

Diese Antwort ist offensichtlich. Ich suchte nach etwas eleganterem. BTW 'c' hat mehr als 300 Werte. –

+0

Sollte das in der Frage erwähnt haben. Die Antwort wurde aktualisiert. – septra

Verwandte Themen