如何用python为warc文件编写流mapreduce作业

ltqd579y  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(419)

我正在尝试使用python的warc库为warc文件编写mapreduce作业。下面的代码是为我工作,但我需要这个hadoopmapreduce作业的代码。

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

请告诉我如何修改这个流输入代码。谢谢

qgzx9mmu

qgzx9mmu1#

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流媒体下,当输入文件 .gz ,因为hadoop将取代 \r\n 在warc文件中 \n ,这将破坏warc格式(请参阅此问题:hadoop将\r\n转换为\r\n并破坏arc格式)。作为 warc 包使用正则表达式 "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'

相关问题