2016-03-21 13 views
1

Ich habe CSV-Datei wie:Extrahieren bestimmte Spalt aus CSV-Datei in scala (Funken)

enter image description here

Ich möchte nur die Spalte „Zusammenfassung“ aus der oben angegebenen Datei extrahieren.

I-Code geschrieben:

val read_file2 = sc.textFile("/home/hari/sample_data_exp/extract_column_only.csv") 
read_file2.collect() 

val tmp1 = read_file2.map { line => val parts = line.split(',') 
parts.drop(3).take(1) 

Aber diese Angabe Ausgang als:

enter image description here

Viele "Array()" kommt. Ich möchte nur die Werte dieser Spalte "Zusammenfassung", keine leeren Arrays dazwischen.

Antwort

0

versuchen

val tmp1 = read_file2.map(_.split(",")).map(p=>p(3)).take(100).foreach(println) 

Verwendung p (0) für das erste Feld und p (3) für das vierte usw.

+0

Ja verwenden können, bekam ich, was ich wollte. Sein Array [String]. Können Sie mir sagen, wie ich jedes Element durchlaufen oder ein bestimmtes Standortelement abrufen kann? –

+0

Was meinen Sie mit einem bestimmten Standort? Bestellt von was? Bestimmte Felder (Spalten) können extrahiert werden, indem Sie den Ort mit der angegebenen Methode oder mit einem Namen angeben. Verwenden Sie dazu ein CSV-Paket ... –

0

Wenn die Datei nicht sehr groß ist, können Sie es in den Speicher laden können:

val tmp1 = file.map { line => line.split(',')(3) } 

Oder etwas prägnanter:

val tmp1 = file.map(_.split(',')(3)) 
2

Wenn Sie nur die Zusammenfassung Teil wollen, ohne Zwischen Arrays, jedoch mit einer einzigen flachen Sequenz, verwenden flatMap:

val summaries = file.flatMap(_.split(',')(3)) 

Aber im CSV suchen, würden Sie wahrscheinlich wollen eine Art Kennung abzurufen, vielleicht so ein Tuple2[String, String] wäre besser:

val idToSummary = file.map(line => { 
    val lines = line.split(',') 
    (lines(2), lines(3)) 
}) 
+0

Ich erhalte den Fehler: –

+0

Welchen Fehler bekommen Sie, @Shalini? – halfer

1

ich würde empfehlen, eine eigene CSV-Bibliothek verwenden, da das CSV-Format viele überraschende Kante Fälle, dass ein einfaches „lesen Zeile für Zeile, geteilt durch“, hat mit nicht beschäftigen.

Es gibt verschiedene Qualität CSV-Bibliotheken - scala-csv, purecsv, jackson-csv ... Ich werde kantan.csv empfehlen, weil ich der Autor bin und fühle, dass es eine gute Wahl ist, aber ich zugeben, voreingenommen zu sein .

Wie dem auch sei, vorausgesetzt, Sie die kantan.csv Bibliothek in Ihrem Classpath haben, ist hier, wie es geht (content Annahme, daß ein java.io.File):

import kantan.csv.ops._ 

content.asUnsafeCsvReader[List[String]](',', true).collect { 
    case _ :: _ :: s :: _ => s 
} 

Damit wird Ihre Datei in ein Iterator auf CSV-Zeilen, in denen Jede Zeile wird als List[String] dargestellt und weist dann jede Zeile dem Wert ihrer dritten Spalte zu (Zeilen, die nicht drei oder mehr Spalten enthalten, werden ignoriert).

0

Sie können:

val read_file2 = sc.textFile("path") 

read_file2.map(_.split(",")(3)).collect 

Wenn Sie Spaltenwerte abrufen möchten, basierend auf Spaltennamen Sie Funken csv databricks Bibliothek

val df=sqlContext.read.format("csv").option("header","true").load("pathToCSv") 
df.select("columnName").collect() // here Summary 
Verwandte Themen