2017-09-25 4 views
2

Ich habe einen Datenrahmen, die einige mehrzeiligen Beobachtungen hat:Wie behandelt man mehrzeilige Reihen in Funken?

+--------------------+----------------+ 
|   col1|    col2| 
+--------------------+----------------+ 
|something1   |somethingelse1 | 
|something2   |somethingelse2 | 
|something3   |somethingelse3 | 
|something4   |somethingelse4 | 
|multiline 

row    |  somethings| 
|something   |somethingall | 

Was ich will, ist in csv-Format (oder txt) diesen Datenrahmen zu speichern. Verwenden Sie Folgendes:

df 
.write 
.format("csv") 
.save("s3://../adf/") 

Aber wenn ich die Datei überprüfen, trennt es die Beobachtungen zu mehreren Zeilen. Was ich will, ist die Zeilen, die "mehrzeilige" Observatios eine gleiche Zeile in der txt/csv-Datei haben. Ich habe versucht, es als TXT-Datei zu speichern:

df 
.as[(String,String)] 
.rdd 
.saveAsTextFile("s3://../adf") 

aber die gleiche Ausgabe wurde beobachtet.

Ich kann mir vorstellen, dass eine Möglichkeit ist, \n durch etwas anderes zu ersetzen und nach dem Zurückladen die umgekehrte Funktion auszuführen. Aber gibt es eine Möglichkeit, es in der gewünschten Weise zu speichern, ohne irgendeine Art von Transformation zu den Daten zu machen?

Antwort

2

Standardmäßig berücksichtigt spark saveTextFile eine andere Zeile, wenn es auf \ n trifft. Das gleiche gilt für CSV. Beim CSV-Lesen können Sie das Trennzeichen mit der Option ("delimiter", "\ t") angeben.

Meiner Meinung nach ist der beste Weg, mehrzeilige Eingabe zu lesen, HadoopAPI. Sie können ein eigenes Trennzeichen angeben und die Daten verarbeiten.

Etwas wie folgt aus:

import org.apache.hadoop.io.LongWritable 
import org.apache.hadoop.io.Text 
import org.apache.hadoop.conf.Configuration 
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat 

val conf = new Configuration 
conf.set("textinputformat.record.delimiter", "<your delimiter>") 
val data: RDD[(LongWritable, Text)] =spark.sparkContext.newAPIHadoopFile(<"filepath">, classOf[TextInputFormat], classOf[LongWritable], classOf[Text], conf) 

Hier im Daten Text ist der Begrenzer getrennt String

1

die mehrzeiligen Daten Unter der Annahme, richtig zitiert, können Sie mehrzeiligen CSV-Daten unter Verwendung der Univozität analysieren Parser und das mehrzeilige

sparkSession.read 
    .option("parserLib", "univocity") 
    .option("multiLine", "true") 
    .csv(file) 

Beachten Sie, dass dies erfordert die gesamte Datei auf als einzelne Testamentsvollstrecker zu lesen, und kann nicht funktionieren, wenn Ihre Daten zu groß Einstellung ist. Beim Lesen der Standard-Textdatei wird die Datei nach Zeilen aufgeteilt, bevor Sie eine andere Analyse durchführen. Dadurch können Sie nicht mehr mit Datensätzen arbeiten, die Zeilenumbrüche enthalten, es sei denn, Sie verwenden ein anderes Trennzeichen für Datensätze. Wenn nicht, müssen Sie möglicherweise ein benutzerdefiniertes TextInputFormat implementieren, um mehrzeilige Datensätze zu verarbeiten.

Verwandte Themen