Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中为warc文件编写流式mapreduce作业_Python_Hadoop_Mapreduce_Hadoop Streaming_Warc - Fatal编程技术网

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

如何在python中为warc文件编写流式mapreduce作业,python,hadoop,mapreduce,hadoop-streaming,warc,Python,Hadoop,Mapreduce,Hadoop Streaming,Warc,我正在尝试使用python为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.

我正在尝试使用python为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
请告诉我如何修改流式输入的代码。谢谢
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会将WARC文件中的所有
\r\n
替换为
\n
,这将破坏WARC格式(请参阅此问题:)。由于
warc
包使用正则表达式
“warc/(\d+。\d+)\r\n”
来匹配标头(精确匹配
\r\n
),您可能会遇到以下错误:

IOError: Bad version line: 'WARC/1.0\n'
因此,您可以按照参考问题中的建议修改
PipeMapper.java
文件,或者编写自己的解析脚本,逐行解析WARC文件

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

IOError: Expected '\n', found 'abc\n'