2017-05-19 3 views
0

Ich habe eine CSV-Datei mit einer der Spalten mit Wert in Anführungszeichen eingeschlossen. Diese Spalte enthält auch Kommas. Wie lese ich diese Art von Spalten in CSV in Spark mit Scala in eine RDD. In Anführungszeichen eingeschlossene Spaltenwerte sollten als Integer-Typ gelesen werden, da sie Werte wie Total Assets, Total Debts sind.Lesen Sie eine CSV-Datei mit, wie Trennzeichen und numerische Daten auch enthalten, Trennzeichen zum Erstellen RDD in Spark mit Scala

Beispiel Datensätze aus csv ist

Jennifer,7/1/2000,0,,0,,151,11,8,"25,950,816","5,527,524",51,45,45,45,48,50,2,, 
John,7/1/2003,0,,"200,000",0,151,25,8,"28,255,719","6,289,723",48,46,46,46,48,50,2,"4,766,127,272",169 
+0

Ich habe versucht {val result = input.map (x => x.split (","))}. Es nimmt "25 als eine Spalte Wert und 950 als eine andere Spalte Wert aus der ersten Zeile. Aber konnte nicht mehr Ideen bekommen. – ibh

Antwort

0

Ich möchte Sie mit SQLContext als csv Datei zu lesen, als es Mechanismen und flexible api s gut getestet Ihre Bedürfnisse
Sie

tun können, erfüllen
val dataframe =sqlContext.read.csv("path to your csv file") 

Ausgang wäre

+-----------+--------+---+----+-------+----+---+---+---+----------+---------+----+----+----+----+----+----+----+-------------+----+ 
|  _c0|  _c1|_c2| _c3| _c4| _c5|_c6|_c7|_c8|  _c9|  _c10|_c11|_c12|_c13|_c14|_c15|_c16|_c17|   _c18|_c19| 
+-----------+--------+---+----+-------+----+---+---+---+----------+---------+----+----+----+----+----+----+----+-------------+----+ 
| Jennifer|7/1/2000| 0|null|  0|null|151| 11| 8|25,950,816|5,527,524| 51| 45| 45| 45| 48| 50| 2|   null|null| 
|Afghanistan|7/1/2003| 0|null|200,000| 0|151| 25| 8|28,255,719|6,289,723| 48| 46| 46| 46| 48| 50| 2|4,766,127,272| 169| 
+-----------+--------+---+----+-------+----+---+---+---+----------+---------+----+----+----+----+----+----+----+-------------+----+ 

Jetzt können Sie die header names ändern, change the required columns to integers und tun eine Menge Dinge
Sie es sogar zu rdd
Herausgegeben
Wenn Sie lesen lieber ändern in RDD und bleiben in RDD, dann
Lesen Sie die Datei mit sparkContext als textFile

val rdd = sparkContext.textFile("/home/anahcolus/IdeaProjects/scalaTest/src/test/resources/test.csv") 

spalten dann die Linien mit , von , zwischen "

rdd.map(line => line.split(",(?=([^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)", -1)) 
0

ignorieren @ibh diese spezielle Sachen Funken oder Scala nicht. In Spark lesen Sie die übliche Art und Weise auch

 val conf = new SparkConf().setAppName("app_name").setMaster("local") 
     val ctx = new SparkContext(conf) 
     val file = ctx.textFile("<your file>.csv") 
     rdd.foreach{line => 
     // cleanup code as per regex below 
     val tokens = line.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1) 
     // side effect 
     val myObject = new MyObject(tokens) 
     mylist.add(myObject) 
    } 

Siehe this regex Datei.

+0

dieser Ansatz mein Problem behoben. Danke – ibh

+0

gut @ibh .. Pl markieren Sie meine Antwort als die ausgewählte Option .. Danke –

Verwandte Themen