복붙노트

[HADOOP] 단지 중복을 방출하는 감속기를 얻는 방법

HADOOP

단지 중복을 방출하는 감속기를 얻는 방법

나는 모든 걸쳐 두 번 이상 발견 된 모든 ID의 목록을 얻으려면 1의 값 키로 ID 번호를 내가 맵리 듀스 작업으로 달성하기 위해 희망하는 것은 많은 데이터를 통과하고 발광하는 매퍼가 중복 된 ID의 목록입니다 데이터. 예를 들면 :

매퍼 방출 : ABC 1 EFG 1 그들은 일을했다 ABC 1 DHH 1

이 경우 ID 'ABC'가 매퍼에 의해 한 번 이상 방출 된 것을 볼 수 있습니다.

그것은 단지 중복을 방출 할 수 있도록하는 방법이 감속기를 수정합니까? 1보다 큰 값을 갖는, 즉 키 :

import sys
import codecs

sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
inData = codecs.getreader('utf-8')(sys.stdin)

(last_key, tot_cnt) = (None, 0)
for line in inData:
    (key, val) = line.strip().split("\t")
    if last_key and last_key != key:
        sys.stdout.write("%s\t%s\n" % (last_key,tot_cnt))
        (last_key, tot_cnt) = (key, int(val))
    else:
        (last_key, tot_cnt) = (key, tot_cnt + int(val))

if last_key:
    sys.stdout.write("%s\t%s\n" % (last_key, tot_cnt))

해결법

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

    1.당신은 몇 곳에서 실수를 범했다.

    당신은 몇 곳에서 실수를 범했다.

    나를 위해 작동 수정 된 코드는 다음과 같은 :

    import sys
    import codecs
    
    sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
    inData = codecs.getreader('utf-8')(sys.stdin)
    
    (last_key, tot_cnt) = (None, 0)
    for line in inData:
        (key, val) = line.strip().split("\t")
        if last_key != key:
            if(tot_cnt > 1):
                sys.stdout.write("%s\t%s\n" % (last_key, tot_cnt))
            (last_key, tot_cnt) = (key, int(val))
        else:
            (last_key, tot_cnt) = (key, tot_cnt + int(val))
    
    if last_key and tot_cnt > 1:
        sys.stdout.write("%s\t%s\n" % (last_key, tot_cnt))
    

    나는 당신의 데이터 출력을 다음 얻을 :

    abc     2
    
  2. from https://stackoverflow.com/questions/34233451/how-to-get-the-reducer-to-emit-only-duplicates by cc-by-sa and MIT license