3 Stimmen

Generierung von Bigram-Kombinationen aus gruppierten Daten im Schwein

Meine Eingabedaten im Format userid,itemid:

raw: {userid: bytearray,itemid: bytearray}

dump raw;
(A,1)
(A,2)
(A,4)
(A,5)
(B,2)
(B,3)
(B,5)
(C,1)
(C,5)

grpd = GROUP raw BY userid;

dump grpd;

(A,{(A,1),(A,2),(A,4),(A,5)})
(B,{(B,2),(B,3),(B,5)})
(C,{(C,1),(C,5)})

Ich möchte alle Kombinationen (die Reihenfolge spielt keine Rolle) von Elementen innerhalb jeder Gruppe erstellen. Ich beabsichtige schließlich, Jaccard-Ähnlichkeit auf die Elemente in meiner Gruppe anzuwenden.

Im Idealfall würde ich die Bigramme generieren und dann die Ausgabe so FLATTEN, dass sie wie folgt aussieht:

(A, (1,2))
(A, (1,3))
(A, (1,4))
(A, (2,3))
(A, (2,4))
(A, (3,4))
(B, (1,2))
(B, (2,3))
(B, (3,5))
(C, (1,5))

Die Buchstaben ABC, die für die Benutzerkennung stehen, sind für die Ausgabe nicht wirklich notwendig, ich zeige sie nur zu Illustrationszwecken. Von dort aus würde ich die Anzahl der Vorkommen der einzelnen Bigramme zählen, um jaccard zu berechnen. Ich würde gerne wissen, ob jemand anderes Pig für ähnliche Ähnlichkeitsberechnungen verwendet (sorry!) und bereits auf dieses Problem gestoßen ist.

Ich habe mir den NGramGenerator angeschaut, der mit den Schweinetutorials geliefert wird, aber er passt nicht wirklich zu dem, was ich zu erreichen versuche. Ich frage mich, ob vielleicht eine Python-Streaming-UDF der Weg zu gehen ist.

1voto

A Question Asker Punkte 3417

Sie werden auf jeden Fall eine UDF schreiben müssen (in Python oder Java, beides wäre gut). Sie möchten, dass die UDF mit einem Beutel arbeitet und dann einen Beutel ausgibt (wenn Sie einen Beutel mit Tupeln glätten, erhalten Sie Ausgabezeilen, sodass Sie die gewünschte Ausgabe erhalten).

der UDF selbst wäre nicht besonders schwierig... etwa so

letter, number = zip(*input_touples)
number = list(set(number)

for i in range(0,len(number)):
    for j in range(i,len(number)):
        res.append((number[i],number[j]))

und dann einfach Dinge werfen und sie entsprechend zurückgeben.

Wenn Sie Hilfe benötigen, um ein einfaches Python udf zu erstellen, ist das gar nicht so schlimm. Schau mal hier: http://pig.apache.org/docs/r0.8.0/udf.html

Und natürlich können Sie auch hier um weitere Hilfe bitten

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X