복붙노트

[HADOOP] 피클과 sys.stdin를 사용하여 하둡에서 defaultdict로드

HADOOP

피클과 sys.stdin를 사용하여 하둡에서 defaultdict로드

나는 시간 전에 비슷한 질문을 게시,하지만 이후 잘못된 질문을했다 실현 후 삭제했다. 나는 다음 절인 defaultdict 있습니다 :

ccollections
defaultdict
p0
(c__builtin__
list
p1
tp2
Rp3
V"I love that"
p4
(lp5
S'05-Aug-13 10:17'
p6
aS'05-Aug-13 10:17'

하둡을 사용하는 경우, 입력은 항상 사용하여 읽기 :

for line in sys.stdin:

나는이를 사용하여 절인 defaultdict를 읽는 시도 :

myDict = pickle.load(sys.stdin)
for text, date in myDict.iteritems():

그러나 아무 소용이. 내가 로컬 ( '파일 이름 .txt')를 .load 사용하여 테스트로 코드의 나머지 부분은 작동합니다. 나는이 잘못을하고 있습니까? 어떻게 정보를로드 할 수 있습니까?

최신 정보:

온라인 튜토리얼을 수행 한 후, 나는이 내 코드를 수정할 수 있습니다 :

def read_input(file):
    for line in file:
        print line

def main(separator='\t'):
    myDict = read_input(sys.stdin)

: 그러나, defaultdict 구조의 어떤 외관이 출력, 보관하지 않습니다 -이 성공적으로 파일을 읽고 보여주는 각 행을 출력

p769    

aS'05-Aug-13 10:19' 

p770    

aS'05-Aug-13 15:19' 

p771    

as"I love that" 

분명히 이것은 좋지는 않습니다. 사람이 어떤 제안이 있습니까?

해결법

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

    1.왜 피클 형식으로 입력 데이터는? 사용자의 입력 데이터는 어디에서 오는가? 하둡 / 맵리 듀스의 목표 중 하나는 단일 시스템의 메모리에 비해 너무 큰 데이터를 처리하는 것입니다. 따라서, 전체 입력 데이터를 읽고 다음을 직렬화하려고하면 MR 디자인 패러다임에 반하는 실행 가능성도 생산 규모의 데이터 세트와 함께 작동하지 않습니다.

    왜 피클 형식으로 입력 데이터는? 사용자의 입력 데이터는 어디에서 오는가? 하둡 / 맵리 듀스의 목표 중 하나는 단일 시스템의 메모리에 비해 너무 큰 데이터를 처리하는 것입니다. 따라서, 전체 입력 데이터를 읽고 다음을 직렬화하려고하면 MR 디자인 패러다임에 반하는 실행 가능성도 생산 규모의 데이터 세트와 함께 작동하지 않습니다.

    이 솔루션은 행 당 사전 정확히 하나의 튜플로 예를 들어,로, TSV 텍스트 파일을 사용자의 입력 데이터를 포맷하는 것입니다. 그런 다음 예컨대, 자신의 각 튜플을 처리 할 수 ​​있습니다 :

    for line in sys.stdin:
        tuple = line.split("\t")
        key, value = process(tuple)
        emit(key, value)
    
  2. ==============================

    2.당신이 완전히 데이터를 읽는다면, 나는) (당신이 pickle.loads를 사용할 수 있다고 생각합니다.

    당신이 완전히 데이터를 읽는다면, 나는) (당신이 pickle.loads를 사용할 수 있다고 생각합니다.

    myDict = pickle.loads(sys.stdin.read())
    
  3. from https://stackoverflow.com/questions/18580321/loading-a-defaultdict-in-hadoop-using-pickle-and-sys-stdin by cc-by-sa and MIT license