2017-06-05 1 views
0

Ich habe einen Fall spalten kann, wo ich Dateien mit Zeilen des FormatsNehmen Sie Leser, die durch zwei Arten von Separatoren

Field1,Field2,Field3,Field4,Field5,Field6#Field1,Field2,Field3 

Während die eine Art und Weise zu lesen, dies zu achive wäre ein Rekord Leser wie KeyValueLineRecordReader zu verwenden mit dem Separator #. Aber ich muss den Schlüssel und Wert auf , in meinem UDF unter Verwendung String.split teilen, die ich fühle, kann die Ausführung verlangsamen.
1. Gibt es Aufzeichnungsgeräte, die Formate dieses Typs bereitstellen? 2. Wenn es einen solchen Datensatzschreiber nicht gibt, was sind meine Alternativen zum effizienten Lesen einer solchen Zeile?

Eingangsdaten sind ~ 10 GB.

Antwort

0

Sie können regex im Split verwenden

String line = "Field1,Field2,Field3,Field4,Field5,Field6#Field1,Field2,Field3"; 

String arr [] = line.split(",|#"); 

for (String s : arr) { 
    System.out.println(s); 
} 
+0

Meine Eingabedaten sind um 10GB. Während Split ist etwas, das ich gerade benutze, fühle ich, dass es rohe Kraft ist, damit umzugehen. (nichts, um es zu unterstützen eher eine Intuition). – Vishnu

+0

Nun, Sie könnten einfach für eine traditionelle Schleife gehen, die jeden Char einzeln testet - hört sich jedoch langsamer an –

0

Da Sie die Frage mit Apache-Schwein markiert haben, werde ich ein Schwein geben den Datensatz in 1 Feld solution.Load, ersetzen # mit ‚‘ und dann STRSPLIT verwenden, um die einzelnen Felder zu erhalten. Keine Notwendigkeit für Java oder irgendeine UDF.

A = LOAD 'input.txt' AS (line:chararray); 
B = FOREACH A GENERATE STRSPLIT(REPLACE(line,'#',','),',',9); 
DUMP B; 
Verwandte Themen