Python 中怎么使用Hadoop实现统计功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
Python map/reduce
编写 map.py
#!/usr/bin/env python
import sys
def read_inputs(file):
for line in file:
line = line.strip()
yield line.split()
def main():
file = sys.stdin
lines = read_inputs(file)
for words in lines:
for word in words:
print("{}\t{}".format(word, 1))
if __name__ == "__main__":
main()
测试
echo "Hello world Bye world" | ./map.py
Hello 1
world 1
Bye 1
world 1
编写 reduce.py
#!/usr/bin/env python
import sys
def read_map_outputs(file):
for line in file:
yield line.strip().split("\t", 1)
def main():
current_word = None
word_count = 0
lines = read_map_outputs(sys.stdin)
for word, count in lines:
try:
count = int(count)
except ValueError:
continue
if current_word == word:
word_count += count
else:
if current_word:
print("{}\t{}".format(current_word, word_count))
current_word = word
word_count = count
if current_word:
print("{}\t{}".format(current_word, word_count))
if __name__ == "__main__":
main()
测试
echo "Hello World Bye World Hello" | ./map.py | sort | ./reduce.py
Bye 1
Hello 2
World 2
上面都是使用 Python 自己的特性去进行统计,下面展示使用 Hadoop 的流程来执行
使用 MapReduce 执行 Python 脚本
查找 hadoop-stream 库的位置
find ./ -name "hadoop-streaming*.jar"
./local/hadoop/share/hadoop/tools/sources/hadoop-streaming-2.7.3-test-sources.jar
./local/hadoop/share/hadoop/tools/sources/hadoop-streaming-2.7.3-sources.jar
./local/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar
在 HDFS 上建立读入文件夹 input
hadoop -fs mkdir input
将待处理文件放入 HDFS
hadoop -fs put allfiles input
运行命令处理
hadoop jar ~/local/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar -input input -output output -mapper ./map.py -reducer ./reduce.py
处理后的文件
Bye 1
Goodbye 1
Hadoop 2
Hello 2
World 2
关于Python 中怎么使用Hadoop实现统计功能问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注天达云行业资讯频道了解更多相关知识。