2013-09-02 10 views
0

Я отправил аналогичный вопрос около часа назад, но с тех пор удалил его после осознания того, что задал неправильный вопрос. У меня есть следующие маринованные defaultdict:Загрузка defaultdict в Hadoop с использованием pickle и sys.stdin

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' 

При использовании Hadoop, вход всегда считывается при помощи:

for line in sys.stdin: 

Я попытался чтении маринованные defaultdict с помощью этого:

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

Но но безрезультатно. Остальная часть кода работает, когда я тестировал его локально, используя .load ('filename.txt'). Я делаю это неправильно? Как загрузить информацию?

Update:

Выполнив онлайн учебник, я могу изменить свой код к этому:

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

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

Это печатает каждую строку, показывая, что успешно читает файл - однако, нет semblence из defaultdict структуры сохраняются, при этом выходе:

p769  

aS'05-Aug-13 10:19' 

p770  

aS'05-Aug-13 15:19' 

p771  

as"I love that" 

Очевидно, что это не хорошо. Есть ли у кого-нибудь предложения?

ответ

1

Почему ваши входные данные в формате рассола? Откуда берутся ваши исходные данные? Одной из целей Hadoop/MapReduce является обработка данных, которые слишком велики, чтобы вписаться в память одной машины. Таким образом, считывая все входные данные, а затем пытаясь десериализовать его, он противоречит парадигме MR-дизайна и, скорее всего, даже не будет работать с наборами данных масштаба производства.

Решение состоит в форматировании входных данных в виде текстового файла TSV, содержащего ровно один кортеж вашего словаря в строке. Затем вы можете обрабатывать каждый кортеж самостоятельно, например:

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

В другом скрипте defaultdict был записан в файл с помощью ряда ключей (твитов), сопоставленных значениям (время их публикации). Это было сделано так, чтобы ретвиты могли иметь многократное указание, когда они были в твиттере, в отличие от обычного словаря, который мог иметь только одно значение за ключ. Pickle использовался только для того, чтобы сохранить этот файл defaultdict в файле. –

+0

Я знаю, как использовать writerow для записи в файл csv, но то, что я пытаюсь сказать, я не знаю, как написать файл defaultdict для этого файла –

+0

@AndrewMartin Ответ по-прежнему остается в силе: do not используйте Pickle или вы не сможете разумно обрабатывать данные с помощью Hadoop. См. [Здесь] (http://stackoverflow.com/questions/8685809/python-writing-a-dictionary-to-a-csv-file-with-one-line-for-every-key-value) для примера о том, как написать dict в файл csv. – jkovacs

0

Если вы полностью читаете данные, я считаю, что вы можете использовать pickle.loads().

myDict = pickle.loads(sys.stdin.read()) 
+0

Спасибо за это, но, к сожалению, он, похоже, не работает. Теперь я удалил все остальное из проекта, кроме загрузки файла и оператора печати, чтобы подтвердить, что это ошибка, поэтому определенная проблема с загрузкой. –

 Смежные вопросы

  • Нет связанных вопросов^_^