2017-01-04 3 views
0

Ich bin neu bei Spark (weniger als 1 Monat!) Und arbeite mit einer flachen Datei Rohdateneingabe, die feste Breite ist. Ich verwende sqlContext, um die Datei mit com.databricks.spark.csv einzulesen und dann .withColumn zu verwenden, um die Zeilen basierend auf den festgelegten Breiten zu unterteilen.Spark lesen in fester Breite Datei

rawData.withColumn("ID"), trim(rawData['c0'].substr(1,8))) 

Das Problem, das mir begegnet, ist, dass das letzte Feld von variabler Breite ist. Es hat einen festen Startpunkt, aber eine variable Anzahl von 'Mengen' von Daten, die 20 Zeichen breit sind. So zum Beispiel

Row 1 A 1243 B 42225 C 23213 
Row 2 A 12425 
Row 3 A 111 B 2222 C 3 D 4 E55555 

muß ich schließlich in den variablen Feldern zu lesen, ziehen Sie nur das erste Zeichen jeder Gruppe in der variablen Breite Spalte, und dann so umgesetzt werden, dass die Ausgabe wie folgt aussieht:

Row 1 A 
Row 1 B 
Row 1 C 
Row 2 A 
... 
Row 3 D 
Row 3 E 

Ich habe in den Spalten mit fester Breite gelesen, die ich brauche, aber ich bin in der variablen Breite stecken.

+0

Sie umsetzen können Regex verwenden Numeric zu entfernen, so dass Sie mit Alphabeten enden. – Abhi

Antwort

0

zipWithIndex und explodieren kann helfen, die Daten in Zeilen jedes Elements

sc.textFile ("csv.data").map(_.split("\\s+")).zipWithIndex.toDF("dataArray","rowId").select ($"rowId",explode($"dataArray")).show(false) 

+-----+------+ 
|rowId|col | 
+-----+------+ 
|0 |A  | 
|0 |1243 | 
|0 |B  | 
|0 |42225 | 
|0 |C  | 
|0 |23213 | 
|1 |A  | 
|1 |12425 | 
|2 |A  | 
|2 |111 | 
Verwandte Themen