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

InformationsquelleAutor user3560220 | 2016-05-02
Schreibe einen Kommentar