mapreduce编程来过滤一个大的输入文件

0x6upsns  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(297)

我有一个非常大的输入文本文件,格式如下:

ID \t time \t product \t Description \t Status

状态列仅限于包含小写a、s、i或大写a、s、i或两者的混合(状态列中的示例元素:a、si、i、asi、asi、asi、asi…)
我想要实现的是使用mapreduce根据状态过滤掉这个输出文件。我要放弃原始文件中状态至少为1个大写字母的所有行。换句话说,我只关心状态中所有小写字母的行。
我是mapreduce编程新手,需要一些帮助。下面是我到目前为止的想法
我的mapper.py是:

import sys
import re

for line in sys.stdin:
    line = line.strip()
    portions = re.split(r'\t+', line)
    status = portions[-1] #pop out last item (status info) from portions list
    #Now I want to emit key as status and value as the portions list
    print '%s\t%s' % (status, portions) #obviously, I don't think it's correct, I got stuck at this part

我的reducer.py是:

import sys

# I'm assuming that I have read in status and portions.

# In my understanding, the number of output files depend on the number of reducers. But what I want is to discard all rows that has at least 1 upper case letter in status bar.

# The file output should be a single file with rows that have all lower case letters in status bar.

我认为检查status是否至少有1个大写字母并不难,但是我被困在了如何丢弃我不感兴趣的行以及如何将所有输出文件合并到一个与原始文本文件格式相同的文件中。
非常感谢任何能指引我走上正确道路的帮助。提前谢谢!

dwbf0jvd

dwbf0jvd1#

你完全可以不用减速器,
在Map绘制程序中类似这样的内容:

import sys
import re

for line in sys.stdin:
    line = line.strip()
    portions = re.split(r'\t+', line)
    status = portions[-1]
    if status.islower():
        whatever_you_want_to_write = status + ',' + portions #whatever
        sys.stdout.write(whatever_you_want_to_write)

有关读取/写入hdfs的详细信息,请参阅hadoop流的文档。
像这样的事情,例如:

$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
    -input myInputDirs \
    -output myOutputDir \
    -mapper myPythonScript.py \
    -jobconf mapred.reduce.tasks=0 \
    -file myPythonScript.py

注意如何指定 -jobconf mapred.reduce.tasks=0 告诉hadoop不需要reduce步骤。

相关问题