Hadoop Python中读入文件的问题
大家讲道理
大家讲道理 2017-04-17 13:16:32
[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)
大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(1)
大家讲道理

将文件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的位置。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号