我正在尝试使用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
请告诉我如何修改这个流输入代码。谢谢
1条答案
按热度按时间qgzx9mmu1#
warc.open()
是warc.WARCFile()
,和warc.WARCFile()
可以接收fileobj
论点,在哪里sys.stdin
完全是一个文件对象。所以你需要做的就是这样:但是在hadoop流媒体下,当输入文件
.gz
,因为hadoop将取代\r\n
在warc文件中\n
,这将破坏warc格式(请参阅此问题:hadoop将\r\n转换为\r\n并破坏arc格式)。作为warc
包使用正则表达式"WARC/(\d+.\d+)\r\n"
匹配标题(完全匹配\r\n
),可能会出现以下错误:所以你要么修改你的
PipeMapper.java
文件,或者编写自己的解析脚本,逐行解析warc文件。顺便说一句,只需修改
warc.py
使用\n
而不是\r\n
在匹配的头文件中不起作用,因为它读取的内容与文件的长度完全相同Content-Length
,并期望在这之后有两行空行。因此hadoop所做的一定会使内容的长度与属性不匹配Content-Length
因此会导致另一个错误,如: