gpt4 book ai didi

python - Map Reduce 从一行中计算一个参数,然后计算第二个参数

转载 作者:可可西里 更新时间:2023-11-01 16:59:07 25 4
gpt4 key购买 nike

假设我有一个满是行的日志文件:

“a、b、c”,虽然这些是可以具有任何值的变量,但值的重复出现确实会发生,这就是本分析的目的。

第一步

映射所有 'c' URL,其中 'a' 等于特定域,例如“stackoverflow.com”和 c 等于“stackoverflow.com/test/user/”之类的 URL,我编写了一个正则表达式来完成此操作。

第二步

计数(减少)所有计数的 c(URL),这样我就有了一个列表,其中包含每个 URL 的总计数。这很好用。

第三步

(尚未实现和此问题的主题)

为第 2 步中计算的每个 URL 查找所有 b(浏览器名称)。返回一个关系列表,例如字典 ADT 或 JSON,如下所示:

[
{
"url":Stackoverflow.com/login,
"count": 200.654,
"browsers":[
Firefox 33,
IE 7,
Opera
]
},
{..},
{..}
],

我正在考虑在我的代码中引入一个组合器(见下文),或者链式的东西。但这里真正的问题是如何优化我的工作流程,以便我只需要遍历所有日志行一次?

MapReduce 作业 (mrjob)

FULL_URL_WHERE_DOMAIN_EQUALS = mySuperCoolRegex

class MRReferralAnalysis(MRJob):

def mapper(self, _, line):

for group in FULL_URL_WHERE_DOMAIN_EQUALS.findall(line):
yield (group, 1)

def reducer(self, itemOfInterest, counts):
yield (sum(counts), itemOfInterest)

def steps(self):
return [
MRStep( mapper=self.mapper,
reducer=self.reducer)
]

if __name__ == '__main__':
MRReferralAnalysis.run()

总结

这就是我想要的伪代码:

LOGS_1 -> MAPREDUCE OVER SOME_CRITERIA -> LIST_1

FOR EVERY ITEM IN LIST_1:
LOGS_1 -> MAPREDUCE OVER ITEM_CRITERIA -> LIST_2

最佳答案

这是一个非MRJob、非mapreduce的解决方案。它运行一次日志文件。它与您的输出规范略有不同,browsers 是 (browser, count) 元组的列表,它生成无序的字典。 collections.OrderedDict 可以被替换。

假设一个看起来像这样的文件

domain,browser,url
wonderful.edu,IE,wonderful.edu/pix
odd.org,Firefox,odd.org/login
wonderful.edu,Opera,wonderful.edu/pix

读取文件并按域、url、浏览器排序以用于 itertools.groupby

import collections, itertools, operator
with open('fake.log') as f:
lines = [tuple(line.strip().split(',')) for line in f]

lines.sort(key = operator.itemgetter(0,2,1))

一些有用的调用

domain = operator.itemgetter(0)
browser = operator.itemgetter(1)
url = operator.itemgetter(2)

使用 collections.Counter 计算每个 unique url 的浏览器。 url 计数是所有浏览器计数的总和。

results = list()
FULL_URL_WHERE_DOMAIN_EQUALS = re.compile('.*\.(edu|org|com)')
for d, group in itertools.groupby(lines, domain):
# this outer loop only needed if filtering by domain
if not FULL_URL_WHERE_DOMAIN_EQUALS.match(d):
print d
continue
for u, group2 in itertools.groupby(group, url):
browsers = itertools.imap(browser, group2)
browser_count = collections.Counter(browsers)
results.append({'url' : u,
'count' : sum(browser_count.viewvalues()),
'browsers' : browser_count.items()}
)

生产

[{'browsers': [('Chrome', 2), ('IE', 4), ('Opera', 7), ('Firefox', 6)],
'count': 19,
'url': 'odd.org/foo'},
{...},
{...}]

关于python - Map Reduce 从一行中计算一个参数,然后计算第二个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26678130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com