Mit FileFormat-v Serde zu Lesen, benutzerdefinierte text-Dateien
Hadoop/Hive Neuling hier. Ich bin versucht, Daten in einen benutzerdefinierten text-basierten format mit Bienenkorb. Mein Verständnis ist, können Sie entweder schreiben Sie ein benutzerdefiniertes FileFormat
oder eine benutzerdefinierte SerDe
Klasse zu tun. Ist das der Fall oder bin ich Missverständnis? Und was sind einige Allgemeine Richtlinien, welche option Sie wählen, wenn? Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich es herausgefunden. Ich nicht zu schreiben, ein serde schließlich schrieb Sie eine benutzerdefinierte InputFormat (erweitert
org.apache.hadoop.mapred.TextInputFormat
) das gibt einen benutzerdefinierten RecordReader (implementiertorg.apache.hadoop.mapred.RecordReader<K, V>
). Die RecordReader Logik implementiert, um zu Lesen und zu analysieren, eigene Dateien und gibt tab-getrennte Zeilen.Mit, dass ich erklärte meinen Tisch als
Dieser verwendet eine native SerDe. Außerdem ist es erforderlich, geben Sie eine Ausgabe-format wenn Sie eine benutzerdefinierte input-format, so dass ich wählen Sie eine von den built-in output-Formate.
Grundsätzlich müssen Sie verstehen, den Unterschied, dass Sie beim ändern SerDe und und wenn zu ändern fileformat.
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 Formate) Lesen und schreiben von Tabellenzeilen.
3.HDFS-Dateien-->InputFileFormat--> --> Deserializer --> Zeilen-Objekt
4.Row-Objekt -->Serializer --> --> OutputFileFormat --> HDFS-Dateien
So,3. und 4. Punkte sind eindeutig abzuleiten der Unterschied.
Sie brauchen, um benutzerdefinierte Formate(Eingabe/Ausgabe), wenn Sie Lesen möchten, einen Datensatz in einer anderen Weise als üblich(wo die Aufzeichnungen sind getrennt durch '\n').
Und Sie müssen passen SerDe, wenn Sie wollen, um zu interpretieren, das Lesen von Datensätzen in einem benutzerdefinierten Weise.
Nehmen wir ein Beispiel für Häufig verwendete JSON-format.
Szenario 1:
Lassen Sie uns sagen, Sie haben eine Eingabe json-Datei, wo eine Zeile enthält einen json-Datensatz.
So,jetzt muss nur Benutzerdefinierte Serde zu interpretieren, das Lesen Datensatz in einer Weise, die Sie wollen.
Keine Notwendigkeit der benutzerdefinierten inout format als 1-Zeile 1-Datensatz.
Szenario 2:
Nun, wenn Sie einen input-Datei, wo Ihr einen json-Datensatz erstreckt sich über mehrere Zeilen, und Sie möchten, es zu Lesen, wie es dann ist
zunächst sollten Sie schreiben eine benutzerdefinierte input-format zu Lesen in 1-json-Datensatz und dann das Lesen der json-Datensatz wird zum Benutzerdefinierten SerDe.
Hängt davon ab, was Sie sich von Ihrem text-Datei.
Schreiben Sie eine benutzerdefinierte record-reader, die zum analysieren der text-log-Datei und kehren, wie Sie wollen, Input-format " - Klasse hat diese Arbeit für Sie. Verwenden Sie diese jar-Datei zum erstellen der Hive-Tabelle und laden Sie die Daten in dieser Tabelle.
Reden SerDe, ich nutze es ein wenig anders. Ich benutze beide InputFormat und SerDe, ehemaligen, die zum analysieren der ist-Daten und letztere um Stabilisierung, um meine Metadaten repräsentiert die eigentlichen Daten. Grund, warum ich das tun? Ich will erstellen Sie die entsprechenden Spalten(nicht mehr oder weniger) in der hive-Tabelle für jede Zeile aus meiner log-Datei habe ich, und ich denke, dass SerDe ist die perfekte Lösung für mich.
Schließlich habe ich anzeigen wer zwei erstellen Sie eine Letzte Tabelle, wenn ich Sie wollen, oder halten Sie diese Tabellen, da ist es so, dass ich tun kann, joins zur Abfrage von denen.
Ich mag die Erklärung der Cloudera-blog.
http://blog.cloudera.com/blog/2012/12/how-to-use-a-serde-in-apache-hive/
Wenn Sie mit Hive, schreiben einen serde. Siehe diese Beispiele:
https://github.com/apache/hive/tree/trunk/contrib/src/java/org/apache/hadoop/hive/contrib/serde2
Beachten Sie, dass diese Schnittstelle ist Hive-spezifisches. Wenn Sie möchten, verwenden Sie Ihre benutzerdefinierte Datei-format für die regelmäßige hadoop-jobs, müssen Sie implementieren eine separate Schnittstelle (ich bin mir nicht ganz sicher, welche).
Wenn Sie bereits wissen, wie zu Deserialisieren von Daten in eine andere Sprache, Sie konnte nur schreiben, ein streaming-Auftrag (mit welcher Sprache) und verwenden Sie Ihre vorhandenen Bibliotheken.
Hoffe, das hilft