Python 如何使用MapReduce对键、值对进行排序?
我一直在玩MapReduce,它还是很新的,我想知道我能否得到一些帮助来回答一个我很难回答的问题: 我有一个包含日期和计数的txt文件,希望根据各自的计数按升序对日期进行排序。文本文件如下所示:Python 如何使用MapReduce对键、值对进行排序?,python,mapreduce,mrjob,Python,Mapreduce,Mrjob,我一直在玩MapReduce,它还是很新的,我想知道我能否得到一些帮助来回答一个我很难回答的问题: 我有一个包含日期和计数的txt文件,希望根据各自的计数按升序对日期进行排序。文本文件如下所示: import re 我环顾四周,发现了如下代码: import re 从mrjob.job导入mrjob 从mrjob.step导入MRStep WORD_RE=RE.compile(r“[\w']+”) 类别MRWordFrequencyCount(MRJob): 但这似乎太复杂了,因为正如您从
import re
我环顾四周,发现了如下代码:
import re
从mrjob.job导入mrjob
从mrjob.step导入MRStep
WORD_RE=RE.compile(r“[\w']+”)
类别MRWordFrequencyCount(MRJob):
但这似乎太复杂了,因为正如您从postedDates txt文件中看到的,我已经有了密钥和它们各自的计数。那么,我是否只需要添加第二步,这只是一个reducer函数,它使用“sorted(counts)”对键和值列表进行排序
非常感谢您的时间。考虑到您的特殊设置,您是正确的,当然可以使用单个MapReduce执行任务 您可以跳过示例中的初始步骤,因为您已经有了每个日期(键)的计数。您只需执行第二步,将这些对分组为元组,并根据
count
和date
按升序计数
导入日期时间
从mrjob.job导入mrjob
类别MRDateFrequencyCount(MRJob):
def映射器(自身、线):
日期,计数=行分割(“”)
无收益,(整数(计数),日期)
def减速器(自、自、日期):
对于计数,排序的日期(日期,key=lambda x:(x[0],datetime.datetime.strtime(x[1],“%Y-%m-%d”):
收税日期
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
MRDateFrequencyCount.run()
产生输出:
"\"2006-11-01\"" 1
"\"2006-12-21\"" 1
"\"2006-12-11\"" 2
"\"2007-03-12\"" 3
"\"2007-03-12\"" 3
"\"2006-12-11\"" 2
"\"2006-11-01\"" 1
"\"2006-12-21\"" 1
按降序计数
导入日期时间
从mrjob.job导入mrjob
类别MRDateFrequencyCount(MRJob):
def映射器(自身、线):
日期,计数=行分割(“”)
无收益,(整数(计数),日期)
def减速器(自、自、日期):
对于计数,排序的日期(日期,key=lambda x:(-x[0],datetime.datetime.strtime(x[1],“%Y-%m-%d”)):
收税日期
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
MRDateFrequencyCount.run()
产生输出:
"\"2006-11-01\"" 1
"\"2006-12-21\"" 1
"\"2006-12-11\"" 2
"\"2007-03-12\"" 3
"\"2007-03-12\"" 3
"\"2006-12-11\"" 2
"\"2006-11-01\"" 1
"\"2006-12-21\"" 1
注意:如果图像中的数据的格式与我在下面测试的文本中显示的格式不同,则需要更改strtime
格式字符串'%Y-%m-%d'
这两个MRJob都在没有配置的情况下运行,并且在包含以下文本的文本文档上运行:
"2006-12-21" 1
"2007-03-12" 3
"2006-11-01" 1
"2006-12-11" 2
当然,如果您想更改哪一列(计数或日期)排在第一位或第二位,您可以在任何一个reducer中更改yeild
您还可以使用字符串格式来消除数据集中日期周围的
“
。哇,非常感谢您的详细回复。这对我的理解有很大帮助。谢谢