Ich möchte ein benutzerdefiniertes InputFormat erstellen können, das Sequenzdateien liest, aber zusätzlich den Dateipfad und den Offset innerhalb der Datei anzeigt, in der sich der Datensatz befindet.SequenceFileInputFormat erweitern, um Dateiname + Offset einzubeziehen
Um einen Schritt zurückzukommen, hier ist der Anwendungsfall: Ich habe eine Sequenzdatei mit Daten unterschiedlicher Größe. Die Schlüssel sind meistens irrelevant, und die Werte sind bis zu ein paar Megabyte, die eine Vielzahl von verschiedenen Feldern enthalten. Ich möchte einige dieser Felder in elasticsearch zusammen mit dem Dateinamen und dem Offset indizieren. Auf diese Weise kann ich diese Felder von elasticsearch abfragen und dann den Dateinamen und den Versatz verwenden, um zur Sequenzdatei zurückzukehren und den ursprünglichen Datensatz zu erhalten, anstatt das Ganze in ES zu speichern.
Ich habe diesen ganzen Prozess als ein einzelnes Java-Programm arbeiten. Die SequenceFile.Reader-Klasse gibt praktischerweise getPosition
und seek
Methoden, um dies zu ermöglichen.
Es wird jedoch wahrscheinlich viele Terabytes an Daten geben, daher muss ich dies in einen MapReduce-Job konvertieren (wahrscheinlich nur Map-only). Da die eigentlichen Schlüssel in der Sequenzdatei irrelevant sind, würde ich mit dem Ansatz ein benutzerdefiniertes InputFormat erstellen, das das SequenceFileInputFormat erweitert oder irgendwie verwendet, aber anstelle der eigentlichen Schlüssel einen zusammengesetzten Schlüssel zurückgibt, der aus der Datei besteht und Offset.
Dies erweist sich jedoch in der Praxis als schwieriger. Es scheint, als ob es möglich sein sollte, aber angesichts der tatsächlichen APIs und was ausgesetzt ist, ist es schwierig. Irgendwelche Ideen? Vielleicht sollte ich einen alternativen Ansatz wählen?