2017-04-25 6 views
0

Ich verwende ein Drittanbieter-Paket für Funken, die ein "PointFeature" -Objekt verwendet. Ich versuche, eine CSV-Datei aufzunehmen und Elemente jeder Zeile in ein Array dieser PointFeature-Objekte einzufügen.CSV zu Array von Objekten

Der PointFeature Konstruktor für meine Implementierung sieht wie folgt aus:

Feature(Point(_c1, _c2), _c3) 

wo _C1, _C2 und _c3 die Säulen meiner csv und Doppel vertreten.

Hier ist meine aktuelle Versuch:

val points: Array[PointFeature[Double]] = for{ 
    line <- sc.textFile("file.csv") 
    point <- Feature(Point(line._c1,line._c2),line._c3) 
} yield point 

Mein Fehler zeigt sich, wenn die Spalten Referenzierung

<console>:36: error: value _c1 is not a member of String 
    point <- Feature(Point(line._c1,line._c2),line._c3.toDouble) 
          ^
<console>:36: error: value _c2 is not a member of String 
     point <- Feature(Point(line._c1,line._c2),line._c3.toDouble) 
              ^
<console>:36: error: value _c3 is not a member of String 
     point <- Feature(Point(line._c1,line._c2),line._c3.toDouble) 
                ^

Dies ist natürlich, weil ich einen String Referenzierung bin, als ob es ein Element eines waren Datenrahmen. Ich frage mich, ob es eine Möglichkeit gibt, mit DataFrames in diesem Loop-Format zu arbeiten, oder eine Möglichkeit, jede Zeile in eine Liste von Doubles aufzuteilen. Vielleicht brauche ich eine RDD?

Auch bin ich nicht sicher, dass dies ein Array ergeben wird. Eigentlich vermute ich, es wird eine RDD zurückkehren ...

Ich bin mit Spark-2.1.0 auf Amazon EMR

Hier sind einige andere Fragen, die ich aus gezogen haben:

How to read csv file into an Array of arrays in scala

Splitting strings in Apache Spark using Scala

How to iterate records spark scala?

Antwort

0

Sie könnten eineeinrichten 10 auf diese Weise:

case class Feature(x: Double, y: Double, z: Double) 
sparkSession.read.csv("file.csv") 
    .toDF("x", "y", "z") 
    .withColumn("x", 'x.cast(DoubleType)) 
    .withColumn("y", 'y.cast(DoubleType)) 
    .withColumn("z", 'z.cast(DoubleType)) 
    .as[Feature] 

Dann können Sie verbrauchen Ihre stark typisierte DataSet[Feature] wie Sie sehen, passen.

0

Ich empfehle, dies in kleineren Schritten zu übernehmen.

Step One

Ihre Zeilen als Array/Liste/was auch immer von Strings holen.

val lines = sc.textFile("file.txt").getLines oder so ähnlich.

Schritt zwei

Ihre Linien in ihre eigenen Listen von Spalten brechen.

val splits = lines.map {l => l.split(",")}

Schritt Drei

Ihre colums als vals extrahieren, die Sie

val res = splits.map { 
    case Array(col1, col2, col3) => // Convert to doubles, put in to Feature/Point Structure} 
    case _ => // Handle the case where your csv is malformatted 
} 

Dies kann alles in einem Rutsch durchgeführt werden können, ich teilten sie nur die logische zeigen Schritt von Datei → Listenzeichenfolge → Listenlistenzeichenfolge → Liste Funktion