4

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

import warc
f = warc.open("test.warc.gz")
for record in f:
    print record['WARC-Target-URI'], record['Content-Length']

我希望这段代码从warc文件中读取流输入,即

zcat test.warc.gz | warc_reader.py

请告诉我如何修改此代码以进行流式输入。谢谢

4

1 回答 1

1

warc.open()是 的简写warc.WARCFile(),并且warc.WARCFile()可以接收一个fileobj参数,其中sys.stdin是一个文件对象。所以你需要做的只是这样的事情:

import sys
import warc

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

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

IOError: Bad version line: 'WARC/1.0\n'

因此,您将PipeMapper.java按照参考问题中的建议修改文件,或者编写自己的解析脚本,逐行解析 WARC 文件。

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

IOError: Expected '\n', found 'abc\n'
于 2019-09-05T06:53:11.177 回答