Blog

Konvertieren von Chararray-Benutzer-IDs in Ganzzahlen mit pig

Giovanni Lanzani

Aktualisiert Oktober 22, 2025
3 Minuten

In einem früheren Artikel hat Friso erklärt, wie man Zeilen-IDs mit MapReduce monoton erhöht. Wenn Sie den Artikel gelesen haben (die Markdown-Version umfasst etwa 1700 Wörter), haben Sie vielleicht bemerkt, dass der Prozess nicht gerade einfach ist. Zum Glück hat pig ab Version 0.11 die Funktion RANK Funktion, mit der Sie dasselbe in Pig mit nur einer Handvoll Codezeilen tun können.

Die grundlegende Verwendung von RANK ist so einfach wie das Tippen:

score = LOAD '/path/to/my/file' AS (object_id:int, score:float);

new_score = RANK score;

Mit der Funktion RANK wird zu new_score eine neue Spalte in Bezug auf score hinzugefügt, die eine eindeutige Ganzzahl pro Zeile enthält.

Die Nützlichkeit der Funktion RANK endet hier jedoch noch nicht. Nehmen wir an, wir müssen die Funktion itemsimilarity Mahout-Algorithmus, und alles, was wir haben, ist eine csv-Datei, in der jede Zeile die Form

user_id, object_id, score

wobei user_id eine chararray ist. Mahout akzeptiert in diesem Fall leider keine Hashes, sondern nur ganze Zahlen.

Aber eine blinde Verwendung der Funktion RANK würde nicht ausreichen. Wie Sie vielleicht wissen, berechnet itemsimilarity die Ähnlichkeit zwischen Objekten auf der Grundlage der Interaktionen von Benutzern mit mehreren Objekten. In diesem Fall würde RANK jedem user_id eine andere eindeutige ID zuweisen.

Lassen Sie uns sehen, wie wir dieses Problem lösen können. Die gewünschte Ausgabe hat die Form

integer_user_id, object_id, score

denn das ist es, was Mahout liebt. Der Code für diese Aufgabe lautet

score = LOAD '/path/to/my/file' AS (user_id:chararray, object_id:int, score:float);

user = FOREACH score GENERATE user_id;
unique_users = DISTINCT user;
new_users = RANK unique_users;

new_score = JOIN score BY user_id, new_users BY user_id;
new_score = FOREACH new_score GENERATE rank_unique_users, object_id, score;

STORE new_score INTO '/path/to/new/file' USING PigStorage(',');

Die erste Zeile lädt die Datei und legt sie in score ab. Dann verwenden Sie

user = FOREACH score GENERATE user_id;
unique_users = DISTINCT user;
new_users = RANK unique_users;

geben wir in user die Spalte user_id ein, und in unique_users alle eindeutigen user_id's. Dies ist ein entscheidender Schritt, da wir wollen, dass gleiche Benutzer gleiche ganzzahlige IDs haben. Die letzte Zeile des Blocks fügt die Spalte (die Namenswahl ist eine Schweinekonvention) zu hinzu. Danach erstellen wir new_score

new_score = JOIN score BY user_id, new_users BY user_id;
new_score = FOREACH new_score GENERATE rank_unique_users, object_id, score;

durch eine JOIN. Die letzte Zeile verwirft im Grunde die Spalte , da sie für Mahout-Zwecke nicht mehr benötigt wird. Zum Schluss speichern wir unsere Datei

STORE new_score INTO '/path/to/new/file' USING PigStorage(',');

die nun das gewünschte Format hat.

Verfasst von

Giovanni Lanzani

Contact

Let’s discuss how we can support your journey.