Hadoop Python中读入文件的问题
假设我有一个文件A包含一些
词
(大概有1000多个词),另外5个文件S包含的都是
句子
(大概有3-4亿个句子)。
现在我想统计出A文件中每个单词,在S文件中句子所包含数量,就是S文件中有几个句子包含指定单词。
那么我在编写mapper.py中应该怎样输入这两类文件呢?
下面这么写可以吗?
#! /usr/bin/env python
#encoding=utf-8
import sys
f = file("words.txt")
for word in f.readlines(): # 每行包含一个单词
for line in sys.stdin: # 从HDFS中读入包含句子的文件,每一行包含一个句子
if word in line.strip():
print '%s\t%s' % (word,1)
狗眼各种瞎
10 years, 4 months ago
Answers
将文件A作为输入,Mapper中读文件。
下面是在Hadoop2下的代码(测试通过)。
mapper.py:
#! /usr/bin/env python
import sys
with open('A') as f:
words = [w.strip() for w in f]
for line in sys.stdin:
for w in words:
if w in line:
print '%s\t%s' % (w, 1)
reducer.py:
#! /usr/bin/env python
import sys
from itertools import groupby
def yield_stdin():
for line in sys.stdin:
yield line.rstrip().split('\t', 1)
for k, rows in groupby(yield_stdin(), lambda x: x[0]):
count = sum(int(v) for _, v in rows)
print '%s\t%d' % (k, count)
运行任务:
HADOOP_HOME=/usr/local/hadoop
$HADOOP_HOME/bin/hadoop fs -put S S
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming*.jar \
-file mapper.py -mapper mapper.py \
-file reducer.py -reducer reducer.py \
-file A \ # 重要
-input S -output count_lines
关于Hadoop之前的版本,需要修改hadoop-streaming-x.x.x.jar的位置。
Jastin
answered 10 years, 4 months ago