Ersetzen neue Zeile (\n) Zeichen in csv-Datei - spark-scala
Nur um das problem zu veranschaulichen habe ich ein testset csv-Datei. Aber im real-case-Szenario, das problem zu behandeln, mehr als ein TeraByte Daten.
Ich habe eine CSV Datei, wo die Spalten sind von Anführungszeichen eingeschlossen("col1"). Aber wenn das importieren der Daten getan wurde. Eine Spalte enthält neue-Zeile-Zeichen(\n). Dies führt mich zu viele Probleme, wenn ich wollen speichern Sie Sie als Hive-Tabellen.
Meine Idee war, ersetzen Sie die \n-Zeichen mit der pipe "|" in der Funke.
Ich bisher erreicht :
1. val test = sqlContext.load(
"com.databricks.spark.csv",
Map("path" -> "test_set.csv", "header" -> "true", "inferSchema" -> "true", "delimiter" -> "," , "quote" -> "\"", "escape" -> "\\" ,"parserLib" -> "univocity" ))#read a csv file
2. val dataframe = test.toDF() #convert to dataframe
3. dataframe.foreach(println) #print
4. dataframe.map(row => {
val row4 = row.getAs[String](4)
val make = row4.replaceAll("[\r\n]", "|")
(make)
}).collect().foreach(println) #replace not working for me
Probe-set :
(17 , D73 ,525, 1 ,testing\n , 90 ,20.07.2011 ,null ,F10 , R)
(17 , D73 ,526, 1 ,null , 89 ,20.07.2011 ,null ,F10 , R)
(17 , D73 ,529, 1 ,once \n again, 10 ,20.07.2011 ,null ,F10 , R)
(17 , D73 ,531, 1 ,test3\n , 10 ,20.07.2011 ,null ,F10 , R)
Erwartete Ergebnis festgelegt :
(17 , D73 ,525, 1 ,testing| , 90 ,20.07.2011 ,null ,F10 , R)
(17 , D73 ,526, 1 ,null , 89 ,20.07.2011 ,null ,F10 , R)
(17 , D73 ,529, 1 ,once | again, 10 ,20.07.2011 ,null ,F10 , R)
(17 , D73 ,531, 1 ,test3| , 10 ,20.07.2011 ,null ,F10 , R)
was für mich gearbeitet:
val rep = "\n123\n Main Street\n".replaceAll("[\\r\\n]", "|") rep: String = |123| Main Street|
aber warum bin ich nicht in der Lage zu tun, auf Tupel-basis?
val dataRDD = lines_wo_header.map(line => line.split(";")).map(row => (row(0).toLong, row(1).toString,
row(2).toLong, row(3).toLong,
row(4).toString, row(5).toLong,
row(6).toString, row(7).toString, row(8).toString,row(9).toString))
dataRDD.map(row => {
val wert = row._5.replaceAll("[\\r\\n]", "|")
(row._1,row._2,row._3,row._4,wert,row._6, row._7,row._8,row._9,row._10)
}).collect().foreach(println)
Funke --version 1.3.1
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn du Spark SQL 1.5 oder höher, können Sie erwägen, die Funktionen verfügbar für Spalten. Vorausgesetzt, Sie wissen nicht (oder nicht haben) die Namen für die Spalten, die Sie tun können, wie im folgenden Codeausschnitt gezeigt:
Wenn Sie wissen, den Namen der Spalte, die Sie ersetzen können
df.columns(4)
durch seinen Namen die in beiden vorkommen.Ich hoffe, das hilft.
Cheers.
newDF.rdd
odernewDF.map
regexp_replace(ColName, "[\\r\\n]", "") as trimmed_column
Versuchte ich replaceAll Methode, aber es funktioniert nicht. Hier ist eine alternative, um das gleiche zu erreichen:
Hinweis: möchten Sie möglicherweise verschieben Sie die doppelten code zu trennen-Funktion.
Multi-line-support für CSV Hinzugefügt, spark version 2.2 JIRA und spark-2.2 ist noch nicht freigegeben.
Hatte ich konfrontiert gleiche Problem und gelöst mit die uns helfen, hadoop-input-format und reader.
Kopieren InputFormat-und reader-Klassen aus git und umzusetzen, wie diese:
Eine andere Lösung- Nutzung
CSVInputFormat
von Apache crunch zu Lesen CSV-Datei dann analysieren jede CSV-Zeile mit opencsv:Apache crunch maven-dependency: