我和我的一个朋友正在研究一个相当大的JSON文件。我们希望对此文件的某些部分执行MapReduce,尽可能快速。由于似乎很难将JSON文件直接输入“mrjob作业”,因此我们尝试将所需数据写入文本文件(其中每一行都是一个数组元素,从json中提取)。由于光盘写操作,这个中间步骤占用了太多时间。
以下是我们的mrjob测试文件的示例。
from mrjob.job import MRJob
import json
class ReduceData(MRJob):
def mapper(self, _, line):
lineJSON = json.loads(line)
yield lineJSON[2], 1
def reducer(self, key, values):
yield key, sum(values)
if __name__ == '__main__':
ReduceData.run()
上面的代码运行如下:
$ python reducedata.py data.txt
read_json 如下所示
import ijson
f = open('testData.json')
parser = ijson.parse(f)
if __name__ == '__main__':
for prefix, event, value in parser:
if (prefix, event) == ('data.item', 'start_array'):
item = []
elif prefix == 'data.item.item' and value is not None:
item.append(value)
elif (prefix, event) == ('data.item', '
item = []
# yield data as output, or something?
如上所述,我有两个问题:
1)有没有办法将 read_json.py 的输出作为 reducedata.py 的输入提供,而不执行写入光盘操作?
2)如果1)可以,我该如何指定输出? mrjob需要一个文件,并逐行调用映射器。 read_json.py 中的每个产量(底部注释)应该是“行”。
提前致谢!
-Superdids