генерирование биграммовых комбинаций из сгруппированных данных на свинье - PullRequest
3 голосов
/ 29 июля 2010

учитывая мои входные данные в идентификаторе пользователя, в формате 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)})

Я хотел бы создать все комбинации (порядок не важен) предметов в каждой группе. В конце концов я намереваюсь выполнить сходство с jaccard для предметов в моей группе.

в идеале мои биграммы будут сгенерированы, и тогда я бы ПЛАВИЛА вывод, чтобы выглядеть так:

(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))

Буквы ABC, которые представляют ИД пользователя, на самом деле не нужны для вывода, я просто показываю их в иллюстративных целях. Оттуда я бы посчитал количество вхождений каждой биграммы, чтобы вычислить jaccard. Я хотел бы знать, использует ли кто-нибудь еще свинью для подобных схожих кальков (извините!) И уже сталкивался с этим.

Я посмотрел на NGramGenerator, который поставляется с учебными пособиями по свиньям, но он не совсем соответствует тому, что я пытаюсь выполнить. Я задаюсь вопросом, может быть, пойдет потоковая UDF на Python.

1 Ответ

1 голос
/ 04 января 2011

Вам определенно придется написать UDF (на Python или Java, все будет в порядке). Вы бы хотели, чтобы он работал с сумкой, а затем выводил сумку (если вы сгладите сумку с таплетами, вы получите выходные строки, так что вы получите желаемый результат).

сам UDF не будет ужасно сложным ... что-то вроде

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]))

, а затем просто разыграйте вещи и верните их соответствующим образом.

Если вам нужна помощь в создании простого python udf, это не так уж плохо. Проверьте здесь: http://pig.apache.org/docs/r0.8.0/udf.html

И, конечно, не стесняйтесь просить о помощи здесь

...