Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pickle和sys.stdin在Hadoop中加载defaultdict_Python_Hadoop_Sys_Defaultdict - Fatal编程技术网

Python 使用pickle和sys.stdin在Hadoop中加载defaultdict

Python 使用pickle和sys.stdin在Hadoop中加载defaultdict,python,hadoop,sys,defaultdict,Python,Hadoop,Sys,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' 使用Hadoop时,始终使用以下命令读取输入: for line in sys.stdin: 我尝试使用以下方法读取pickled

大约一个小时前,我发布了一个类似的问题,但在意识到我问错了问题后,我将其删除了。我有以下腌制的
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:
我尝试使用以下方法读取pickled
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" 

显然这是不好的。有人有什么建议吗?

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


为什么您的输入数据是pickle格式?您的输入数据来自哪里?Hadoop/MapReduce的目标之一是处理太大而无法装入单个计算机内存的数据。因此,读取整个输入数据,然后尝试对其进行反序列化,这与MR设计范式背道而驰,而且很可能无法处理生产规模的数据集

解决方案是将输入数据格式化为例如TSV文本文件,每行正好包含一个字典元组。然后,您可以单独处理每个元组,例如:

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

谢谢,但不幸的是,它似乎不起作用。我现在已经删除了项目中的所有内容,除了加载文件和打印语句以确认错误所在,因此加载肯定有问题。在另一个脚本中,defaultdict被写入到文件中,带有一系列映射到值(发布次数)的键(tweet)。这样做是为了让转发可以多次指示它们被推特的时间,而不是一个普通的字典,每个键只能有一个值。Pickle只是用来将这个defaultdict保存到文件中。我知道如何使用writerow写入csv文件,但我想说的是我不知道如何将defaultdict写入该文件way@AndrewMartin答案仍然有效:不要使用Pickle,否则您将无法使用Hadoop明智地处理数据。有关如何将dict写入csv文件的示例,请参阅。感谢您的链接。我想我差不多明白了,但我仍然不知道如何迭代字典。我的内容仍然在defaultdict中,这很好,但是当我使用reader=csv.reader(sys.stdin)和myDict=dict(reader中的x代表x)时,我能够创建一个字典,但我似乎无法用iteritems()和AndrewMartin defaultdict扩展dict进行迭代,因此您可以使用与标准dict完全相同的方式,如链接问题的答案所示。但我觉得这超出了这个问题的范围。
for line in sys.stdin:
    tuple = line.split("\t")
    key, value = process(tuple)
    emit(key, value)