0

大约一个小时前,我发布了一个类似的问题,但在意识到我问错问题后将其删除。我有以下腌制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'

使用 Hadoop 时,始终使用以下方式读取输入:

for line in sys.stdin:

我尝试defaultdict使用以下方法阅读腌制:

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

但无济于事。其余代码在我使用 .load('filename.txt') 本地测试时工作。我做错了吗?如何加载信息?

更新:

遵循在线教程后,我可以将代码修改为:

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" 

显然,这并不好。有人有什么建议吗?

4

2 回答 2

1

为什么你的输入数据是pickle格式?你的输入数据来自哪里?Hadoop/MapReduce 的目标之一是处理太大而无法放入单个机器内存的数据。因此,读取整个输入数据然后尝试反序列化它与 MR 设计范式背道而驰,而且很可能甚至不适用于生产规模的数据集。

解决方案是将输入数据格式化为例如 TSV 文本文件,每行只有一个字典元组。然后,您可以自己处理每个元组,例如:

for line in sys.stdin:
    tuple = line.split("\t")
    key, value = process(tuple)
    emit(key, value)
于 2013-09-02T21:36:15.020 回答
0

如果您完全阅读数据,我相信您可以使用pickle.loads().

myDict = pickle.loads(sys.stdin.read())
于 2013-09-02T20:47:32.323 回答