javascript - Spark 中的Python mapraduce

标签 javascript python hadoop mapreduce apache-spark

我有一些文字,我必须计算使用hadoop的某些单词(例如,John和已婚)的数量。

在Java脚本中,我可以这样写:

require('timothy').map(function(line){
        emit("count", 1);
        if(new RegExp("john", "i").test(line))     emit("John", 1);
        if(new RegExp("marry", "i").test(line))    emit("Marry", 1);
    }).reduce(function(key, values){
        var result = 0;
        values.forEach(function(value){
            result += +value;
        });

        emit(key, result);
}).run();

我将map函数用于所有行,并为每个匹配项写入数据。现在我想用Spark做到这一点,但是我必须用python编写。我有一些代码:
import sys
import re

from operator import add
from pyspark import SparkContext

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print >> sys.stderr, "Usage: wordcount <file>"
        exit(-1)
    sc = SparkContext(appName="PythonWordCount")
    lines = sc.textFile(sys.argv[1], 1)

    def map(line):
        #here must contains map function;


    counts = lines.map(map).reduceByKey(add)
    output = counts.collect()
    for (word, count) in output:
        print "%s: %i" % (word, count)

    sc.stop()

我的问题是我只能记录一个返回的匹配项(键,值),如何制作与第一个示例类似的方法。感谢你。

最佳答案

如果您要问的是我如何在 map 阶段发出多个值。答案是将flatMap运算符与返回一个值序列而不是单个值的函数一起使用。该序列将由flatMap转换拆分。例如:

file = spark.textFile("file://...")
counts = file.flatMap(lambda line: line.split(" ")) \
         .map(lambda word: (word, 1)) \
         .reduceByKey(lambda a, b: a + b)
line.split(" ")返回一个字符串序列。

关于javascript - Spark 中的Python mapraduce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29415327/

相关文章:

javascript - 在 'else' 语句中检查 'if - else' 是否相等

python - kivy 中的音频位置没有改变

java - hadoop javacv代码上的图像处理(模板匹配)

javascript - 使用 Firebase 时如何保护客户端源

javascript - 获取使用 calc 等表达式的 CSS 变量的计算值

python - 按另一个列表对字典列表进行排序

python - 是否可以在 jupyter 中重定向单元格输出

Hadoop MapReduce 作业输入文件 ClassNotFound

Java:连接到 Hbase 0.94.1 时出现异常

javascript - 字符串连接在 JS 范围内不起作用