복붙노트

[HADOOP] 아파치 돼지를 사용하여 파일에서 "문자열 식"을 제거하는 절차 / 코드 무엇을 할 수 있습니까?

HADOOP

아파치 돼지를 사용하여 파일에서 "문자열 식"을 제거하는 절차 / 코드 무엇을 할 수 있습니까?

A = load '/home/wrdtest.txt';

B = foreach A generate flatten(TOKENIZE((chararray)$0)) as word;

C = filter B by word != 'the';

D = group C by word;

E = foreach D generate COUNT(C) as count, group as word;

F = order E by count desc;

store F into '/tmp/sample_data20';

난 그냥 텍스트를 필터링 할. 제 3 단계는 텍스트를 필터링하고 '를'텍스트에서 파일을 제거합니다. 하지만 난 텍스트에서 499 개 단어 (중지 단어)의 집합을 제거 할. 내가 사용하려고 '|' 같은 (또는) :

C = filter B by word != 'the|and|or'...but it didnt work.

정지 단어를 제거하기 위해이에 제안시겠습니까와 나는 (stopwords.txt) 같은 텍스트 파일을 포함 할 수있다.

나는 돼지의 순진한 사용자입니다

해결법

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

    1.중지 단어 제거와 같은 뭔가가 내장 함수에 될 수 없습니다만큼 복잡하다. 당신은 할 매우 간단합니다 사용자 정의 함수를 작성해야합니다.

    중지 단어 제거와 같은 뭔가가 내장 함수에 될 수 없습니다만큼 복잡하다. 당신은 할 매우 간단합니다 사용자 정의 함수를 작성해야합니다.

    -- load the data line by line
    lines = LOAD 'datafile.txt' USING TextLoader() AS (line:chararray);
    
    -- apply some sort of UDF that returns the exact line without the stop words
    nostop = FOREACH lines GENERATE myudfs.removestop(line);
    
    -- store the data out
    STORE nonstop INTO 'datafile_nostop.txt';
    

    작업 밖으로 당신의 목록을 추진하는 것은 또 다른 이야기입니다. 목록 수천의 순서로, 상대적으로 작은 경우, 당신은 그것을 사용할 수 있습니다 있도록 (즉, 목록을 하드 코딩) 코드에 정지 단어를 구울 수 있습니다. 그렇지 않으면, 당신은 파일을 밀어 분산 캐시를 사용할 수 있습니다.

    당신이 제공 한 추가 정보와 함께, 나는 다른 방법을 제안 할 수 있습니다. UDF를 사용하여 내 위의 접근 방식은, 그래도 여전히 유효합니다.

    이 새로운 접근 방식은 다음 효과적으로 목록과 일치하는 것들을 제거하는 방지에 가입하고, 다른 파일을로드 포함 할 것이다. 당신은 확실히 stopwords.txt이 작동하지 위해 한 줄에 하나의 단어를 가지고 확인해야합니다. 할 수있는 안티 조인, 내가 할 수 있습니다 (즉, 가지 다른 목록과 일치하지 않는 목록을 유지) 왼쪽 외부 (복제 사용) 중지 단어 열이 null이고, 다음 (필터링에 가입 즉, 그것은 일치 정지 단어를)하지 않았다.

    A = load '/home/wrdtest.txt';
    
    -- load the stop words list
    SW = load '/home/stopwords.txt' as (stopword:chararray);    
    
    B = foreach A generate flatten(TOKENIZE((chararray)$0)) as word;
    
    -- join the data with a left outer join
    -- using replicated should be done with the right relation (SW) is small
    SW2 = join B by word LEFT OUTER, SW by stopword USING 'replicated';
    
    -- filter out where the stopword is null, meaning it is not in the stopword list
    C = filter SW2 by stopword IS NULL;
    
    -- remove the stopword column that we don't need.
    C = foreach C generate word;
    
    D = group C by word;
    
    E = foreach D generate COUNT(C) as count, group as word;
    
    F = order E by count desc;
    
    store F into '/tmp/sample_data20';
    
  2. ==============================

    2.나는 도널드 광부에 의해 위의 솔루션을 사용했다.

    나는 도널드 광부에 의해 위의 솔루션을 사용했다.

    다음과 같은 부분을 가입에 대해 내가 관계를 수정

    SW2 = join B by word LEFT, SW by stopword;
    

    나를 위해 작동합니다.

  3. from https://stackoverflow.com/questions/8819440/what-can-be-the-procedure-code-to-remove-string-expression-from-a-file-using-a by cc-by-sa and MIT license