복붙노트

[HADOOP] PIG는 텍스트 라인을 희소 벡터로 변환

HADOOP

PIG는 텍스트 라인을 희소 벡터로 변환

Apache PIG를 사용하여 결합 해야하는 파일이 있어야합니다. 첫 번째 파일에는 책 제목 목록이 포함되어 있습니다. 각 제목은 한 줄에 있습니다.

Ted Dunning,  Mahout in Action
Leo Tolstoy,  War and Peace
Douglas Adams, The hitchhiker guide to the galaxy.
James Sununu,  galaxy III for Dummies
Tom McArthur,  The War we went to

두 번째 파일은 단어 및 해당 ID의 목록입니다. 이렇게

ted, 12
tom, 13
douglas, 14
galaxy, 15
war, 16
leo, 17
peace, 18

다음과 같이 출력을 생성하려면이 두 파일을 결합해야합니다.

'Leo Tolstoy, War and peace'라인을 위해

17:1,16:1,18:1

'Tom McArthur, 우리가 간 전쟁'

13:1,16:1

즉, 단어를 키로 사용하여 조인을 수행해야합니다. 지금까지 돼지로 다음 코드를 작성했습니다.

titles = LOAD 'Titles' AS ( title : chararray );  
termIDs = LOAD  'TermIDs' AS (  term:chararray,id:int);

A = SAMPLE titles 0.01;
X = FOREACH A GENERATE STRSPLIT(title,'[ _\\[\\]\\/,\\.\\(\\)]+');

이렇게하면 파일이로드되고 X에는 해당 줄에서 발생하는 용어가 포함 된 각 가방 목록이 포함됩니다. 이처럼 :

((ted,dunning,mahout,in,action))
((leo,tolstoy,war,and,peace))

토요일 밤에 늦었 기 때문에 UDF를 작성하거나 스트리밍을 사용하지 않고 단계에 참여하는 방법을 알 수 없습니다. PIG 프리미티브 만 사용하는 것이 가능합니까?

해결법

  1. ==============================

    1.TOKENIZE의 결과를 FLATTEN 할 수 있으므로 모든 bag이 행이되고 이제 termsID와 X 관계를 결합 할 수 있습니다.

    TOKENIZE의 결과를 FLATTEN 할 수 있으므로 모든 bag이 행이되고 이제 termsID와 X 관계를 결합 할 수 있습니다.

    X = foreach A generate title, flatten(TOKENIZE(title)) as term;
    J = join X by (term),  termIDs by (term);
    G = group J by title;
    Result = foreach G generate group as title, termIDs.id;
    

    위의 코드는 휴대 전화에 입력되었으므로 디버깅되지 않았습니다.

    업데이트 1 :

    TOKENIZE 대신 STRSPLIT를 사용하는 것이 바람직한 경우에는 FLATTEN과 TOBAG를 함께 사용하여 STRSPLIT에서 리턴 한 튜플에서 단어를 가져 오는 TOKENIZE와 동일한 효과를 얻을 수 있습니다.

    SPLT = foreach A generate title, FLATTEN(STRSPLIT(title,'[ _\\[\\]\\/,\\.\\(\\)]+'));
    X_tmp = foreach SPLT generate $0 as title, FLATTEN(TOBAG($1..$20)) as term; -- pivots the row
    X = filter X_tmp by term is not null; -- this removes the extra bag rows when title was split in less than 20 terms
    J = join X by (term),  termIDs by (term) using 'replicated';
    G = group J by title;
    Result = foreach G generate group as title, termIDs.id;
    

    제목이 20 개를 초과하면 TOBAG의 수를 늘리십시오.

  2. from https://stackoverflow.com/questions/12549842/pig-convert-text-lines-to-sparse-vector by cc-by-sa and MIT license