Verwenden von FileFormat v Serde zum Lesen benutzerdefinierter Textdateien

7

Hadoop / Hive Neuling hier. Ich versuche, Daten in einem benutzerdefinierten textbasierten Format mit Hive zu verwenden. Mein Verständnis ist, dass Sie entweder eine benutzerdefinierte FileFormat oder eine benutzerdefinierte SerDe Klasse schreiben können. Ist das der Fall oder missverstehe ich es? Und was sind allgemeine Richtlinien für die Wahl wann? Danke!

    
radimd 12.10.2011, 01:01
quelle

4 Antworten

11

Ich habe es herausgefunden. Ich musste schließlich keinen serde schreiben, schrieb ein benutzerdefiniertes InputFormat (erweitert org.apache.hadoop.mapred.TextInputFormat ), das einen benutzerdefinierten RecordReader zurückgibt (implementiert org.apache.hadoop.mapred.RecordReader<K, V> ). Der RecordReader implementiert Logik zum Lesen und Parsen meiner Dateien und gibt Tab-getrennte Zeilen zurück.

Damit habe ich meine Tabelle als

deklariert %Vor%

Dies verwendet einen nativen SerDe. Außerdem muss ein Ausgabeformat angegeben werden, wenn ein benutzerdefiniertes Eingabeformat verwendet wird. Daher wähle ich eines der integrierten Ausgabeformate.

    
radimd 02.11.2011, 21:34
quelle
6

Im Grunde genommen müssen Sie den Unterschied verstehen, wenn Sie SerDe ändern und wann das Dateiformat geändert werden soll.

Aus der offiziellen Dokumentation: Hive SerDe

Was ist ein SerDe? 1. SerDe ist ein Kurzname für "Serializer und Deserializer". 2.Hive verwendet SerDe (und FileFormat) zum Lesen und Schreiben von Tabellenzeilen. 3. HDFS-Dateien - & gt; InputFileFormat - & gt; - & gt; Deserializer - & gt; Zeilenobjekt 4.Row-Objekt - & gt; Serializer - & gt; - & gt; Ausgabedateiformat - & gt; HDFS-Dateien

Der dritte und der vierte Punkt sind also eindeutig auf den Unterschied zurückzuführen. Sie benötigen ein benutzerdefiniertes Dateiformat (Eingabe / Ausgabe), wenn Sie einen Datensatz anders als sonst lesen möchten (wobei Datensätze durch '\ n' getrennt sind). Und Sie müssen SerDe anpassen, wenn Sie die gelesenen Datensätze in einer benutzerdefinierten Weise interpretieren möchten.

Nehmen wir ein Beispiel für das häufig verwendete Format JSON.

Szenario 1: Angenommen, Sie haben eine Eingabe-JSON-Datei, in der eine Zeile einen JSON-Datensatz enthält. Jetzt brauchen Sie nur noch Custom Serde, um den gelesenen Datensatz so zu interpretieren, wie Sie wollen. Keine Notwendigkeit für benutzerdefinierte Inout-Format als 1 Zeile wird 1 Datensatz.

Szenario 2: Wenn Sie nun eine Eingabedatei haben, in der sich ein einzelner json-Datensatz über mehrere Zeilen erstreckt und Sie ihn so lesen möchten, wie er ist Sie sollten zuerst ein benutzerdefiniertes Eingabeformat schreiben, um 1 json record einzulesen und dann wird dieser gelesene json record zu Custom SerDe gehen.

    
Harry Kumar 14.11.2015 16:16
quelle
2

Hängt davon ab, was Sie von Ihrer Textdatei erhalten.

Sie können einen benutzerdefinierten Datensatzleser schreiben, um die Textprotokolldatei zu analysieren und so zurückzugeben, wie Sie möchten. Die Eingabeformatklasse erledigt diesen Job für Sie. Sie verwenden dieses jar, um die Hive-Tabelle zu erstellen und die Daten in dieser Tabelle zu laden.

Wenn ich über SerDe spreche, benutze ich es ein bisschen anders. Ich benutze sowohl InputFormat als auch SerDe, um die tatsächlichen Daten zu parsen, und letzteres, um die Metadaten zu stabilisieren, die die tatsächlichen Daten darstellen. Warum mache ich das? Ich möchte für jede Zeile meiner Protokolldatei, die ich habe, geeignete Spalten (nicht mehr oder weniger) in der Hive-Tabelle erstellen, und ich denke, SerDe ist die perfekte Lösung für mich.

Schließlich ordne ich diese beiden zu, um eine finale Tabelle zu erstellen, wenn ich diese Tabellen so behalten oder beibehalten möchte, wie sie sind, damit ich Joins daraus abfragen kann.

Ich mag die Erklärung von Cloudera blog.

Ссылка

    
Raviteja Chirala 03.07.2013 21:29
quelle
1

Wenn du Hive verwendest, schreibe eine serde. Siehe diese Beispiele: Ссылка

Beachten Sie, dass diese Schnittstelle hive-spezifisch ist. Wenn Sie Ihr benutzerdefiniertes Dateiformat für reguläre Hadoop-Jobs verwenden möchten, müssen Sie eine separate Schnittstelle implementieren (ich bin mir nicht ganz sicher, welche).

Wenn Sie bereits wissen, wie Sie Daten in einer anderen Sprache deserialisieren, können Sie einfach einen Streaming-Job (in einer beliebigen Sprache) schreiben und Ihre vorhandenen Bibliotheken verwenden.

Ich hoffe, das hilft

    
Matthew Rathbone 27.10.2011 20:46
quelle

Tags und Links