首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在python中为warc文件编写流式mapreduce作业

如何在python中为warc文件编写流式mapreduce作业
EN

Stack Overflow用户
提问于 2014-01-23 14:53:22
回答 1查看 409关注 0票数 4

我正在尝试使用python的WARC library为warc文件编写一个mapreduce作业。以下代码对我有效,但我需要将此代码用于hadoop mapreduce作业。

代码语言:javascript
运行
复制
import warc
f = warc.open("test.warc.gz")
for record in f:
    print record['WARC-Target-URI'], record['Content-Length']

我希望此代码从warc文件读取流输入。

代码语言:javascript
运行
复制
zcat test.warc.gz | warc_reader.py

请告诉我如何为流输入修改此代码。谢谢

EN

回答 1

Stack Overflow用户

发布于 2019-09-05 14:53:11

warc.open()warc.WARCFile()的缩写,warc.WARCFile()可以接收fileobj参数,而sys.stdin恰恰是一个文件对象。所以你需要做的就是这样:

代码语言:javascript
运行
复制
import sys
import warc

f = warc.open(fileobj=sys.stdin)
for record in f:
    print record['WARC-Target-URI'], record['Content-Length']

但是当你的输入文件是.gz时,在hadoop流媒体下事情就有点困难了,因为hadoop会把WARC文件中的所有\r\n替换成\n,这会破坏WARC格式(请参考这个问题:hadoop converting \r\n to \n and breaking ARC format)。由于warc包使用正则表达式"WARC/(\d+.\d+)\r\n"来匹配标头(与\r\n完全匹配),因此您可能会收到以下错误:

代码语言:javascript
运行
复制
IOError: Bad version line: 'WARC/1.0\n'

因此,您可以按照前面提到的问题中的建议修改PipeMapper.java文件,或者编写自己的解析脚本,逐行解析WARC文件。

顺便说一句,简单地将warc.py修改为在匹配的报头中使用\n而不是\r\n是行不通的,因为它读取的内容与Content-Length的长度完全相同,并且在这之后需要两个空行。因此,hadoop的所作所为肯定会使内容的长度与属性Content-Length不匹配,从而导致另一个错误,如:

代码语言:javascript
运行
复制
IOError: Expected '\n', found 'abc\n'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21301337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档