java - Apache Spark - reducebyKey - Java -

标签 java apache-spark

我正在尝试了解 reduceByKey 的工作原理在 Spark 中使用 java 作为编程语言。

假设我有一句话“我就是我”。 我将句子分解成单词并将其存储为列表 [I, am, who, I, am] .

现在这个函数赋值 1每个词:

JavaPairRDD<String, Integer> ones = words.mapToPair(new PairFunction<String, String, Integer>() {
    @Override
    public Tuple2<String, Integer> call(String s) {
        return new Tuple2<String, Integer>(s, 1);
    }
});

所以输出是这样的:

(I,1) 
(am,1)
(who,1)
(I,1)
(am,1)

现在,如果我有 3 个 reducer 正在运行,每个 reducer 将获得一个键以及与该键关联的值:

reducer 1:
    (I,1)
    (I,1)

reducer 2:
    (am,1)
    (am,1)

reducer 3:
    (who,1)

我想知道

一个。下面的函数到底发生了什么。
b.参数是什么new Function2<Integer, Integer, Integer>
C。基本上 JavaPairRDD 是如何形成的。

JavaPairRDD<String, Integer> counts = ones.reduceByKey(new Function2<Integer, Integer, Integer>() {
    @Override
    public Integer call(Integer i1, Integer i2) {
        return i1 + i2;
    }
});

最佳答案

我认为你的问题围绕着这里的 reduce 函数,它是一个 2 个参数返回 1 的函数,而在 Reducer 中,你实现了一个多对多的函数。

如果不那么通用,这个 API 会更简单。在这里,您提供了一个关联运算,可以将任何 2 个值减少到 1(例如,两个整数之和为 1)。这用于将每个键的所有值减少为 1。没有必要提供 N 对 1 函数,因为它可以通过 2 对 1 函数来完成。在这里,您不能为一个键发出多个值。

结果是每个(键,一堆值)的(键,减少的值)。

经典 Hadoop MapReduce 中的 Mapper 和 Reducer 实际上都非常相似(只是一个采用一组值而不是每个键的单个值)并且让您实现很多模式。以一种好的方式,以一种既浪费又复杂的方式。

您仍然可以重现 Mappers 和 Reducers 所做的事情,但 Spark 中的方法是 mapPartitions,可能与 groupByKey 配对。这些是您可能会考虑的最通用的操作,我并不是说您应该在 Spark 中以这种方式模拟 MapReduce。事实上,它不太可能是有效的。但这是可能的。

关于java - Apache Spark - reducebyKey - Java -,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25091091/

相关文章:

java - 处理不灵活的第三方库的策略

java - 我可以为 InputStream 的 read() 函数设置超时吗?

java - 将数据从可搜索 Activity 返回到上一个 Activity

scala - 无法解析具有此类签名的引用 StructField

apache-spark - Spark Rest api/api/v1 给出了不允许的方法

python-3.x - 值错误: Cannot run multiple SparkContexts at once in spark with pyspark

sorting - Cassandra - 分页解决方案的数据排序?

java - 与模型的音频比较

java - 使用 XMLStreamWriter 将standalone=no 字段添加到 XML 声明

python - 从 Pyspark UDF 调用另一个自定义 Python 函数