Ich bin neu bei Pig und ich möchte einen Beutel mit Tupeln in eine Karte mit einem bestimmten Wert in jedem Tupel als Schlüssel konvertieren. Grundsätzlich möchte ich ändern:
{(id1, value1),(id2, value2), ...}
in [id1#value1, id2#value2]
Ich habe mich schon eine Weile online umgesehen, aber ich finde keine Lösung. Ich habe es versucht:
%Vor% Aber ich lande mit einer Tasche von Karten (z. B. {[id1#value1], [id2#value2], ...}
), was ich nicht will. Wie kann ich eine Karte aus einem Beutel mit Schlüssel-Wert-Tupeln erstellen?
Unten ist das spezifische Skript, das ich ausführen möchte, falls es relevant ist
%Vor% TOMAP
nimmt eine Reihe von Paaren und konvertiert sie in die Karte, so dass es wie folgt verwendet werden soll:
Wie Sie sehen, unterstützt die Syntax das Konvertieren eines Beutels in eine Map nicht. Soweit ich weiß, gibt es keine Möglichkeit, eine Tasche in dem Format zu konvertieren, das Sie in reinem Schwein abbilden müssen. Sie können jedoch definitiv dazu eine java UDF schreiben.
>HINWEIS: Ich bin nicht sehr erfahren mit Java, daher kann diese UDF leicht verbessert werden (Hinzufügen von Ausnahmen, was passiert, wenn ein Schlüssel zweimal hinzugefügt wurde usw.). Es erreicht jedoch, was Sie brauchen.
%Vor%Sobald Sie das Skript in ein jar kompiliert haben, kann es wie folgt verwendet werden:
%Vor% Inhalt von foo.in
:
Ausgabe von B
:
Ein anderer Ansatz besteht darin, python zum Erstellen der UDF zu verwenden :
Welches wird so benutzt:
%Vor%Und erzeugt die gleiche Ausgabe wie die Java-UDF.
BONUS:
Da ich Karten nicht sehr mag, hier ist ein Link, der erklärt, wie die Funktionalität einer Map kann mit nur Schlüsselwertpaaren repliziert werden. Da sich Ihre Schlüsselwertpaare in einem Beutel befinden, müssen Sie die kartenähnlichen Operationen in einem verschachtelten FOREACH
ausführen:
Ich bin in dieselbe Situation geraten, also habe ich einen Patch eingereicht, der gerade akzeptiert wurde: Ссылка
Das bedeutet, dass Sie einen Kernteil haben wollten, der mit Schwein 0.16 beginnt.
Tags und Links map apache-pig