Hadoop Python中读入文件的问题

 广东抱米花_冰月 发布于 2022-11-03 17:10

假设我有一个文件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的位置。

    2022-11-06 07:08 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有