Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ApacheSpark aggregateby密钥的工作原理_Java_Apache Spark - Fatal编程技术网

Java ApacheSpark aggregateby密钥的工作原理

Java ApacheSpark aggregateby密钥的工作原理,java,apache-spark,Java,Apache Spark,我在玩Spark。我对聚合键函数的工作有点困惑 如果我提供非零的初始值。它在总数中添加了2*初始值 以下是代码片段: JavaPairRDD<String, Integer> mapToPair = rdd.mapToPair(message -> new Tuple2<String, Integer>(message.split(",")[0], Integer.parseInt(message.split(",")[1]))) Function2<Int

我在玩Spark。我对聚合键函数的工作有点困惑

如果我提供非零的初始值。它在总数中添加了2*初始值

以下是代码片段:

JavaPairRDD<String, Integer> mapToPair = rdd.mapToPair(message -> new Tuple2<String, Integer>(message.split(",")[0], Integer.parseInt(message.split(",")[1])))

Function2<Integer, Integer, Integer>  mergeValue =(v1, v2) -> v1+v2; Function2<Integer, Integer, Integer>  mergeCombiners =(v1, v2) -> v1+v2;

JavaPairRDD<String, Integer> aggregateByKey = mapToPair.aggregateByKey(1, mergeValue, mergeCombiners);

System.out.println("Aggregate by key "+ aggregateByKey.collect());
我得到的输出是

Aggregate by key [(hello,6)]

请解释它的工作原理

每次在当前分区上看到新的键时,都会添加zeroValue,这样它就可以添加到您拥有的分区数的倍,并且不应该更改merge和seq ops的结果。这就是为什么0对加法有效,而1对加法无效。

我同意@LostInOverflow,下面是为什么Spark在aggregateByKey中有一个零值作为第一个可用的分段的解释:

“在分区内合并值”(参数2)和“在分区之间合并值”(参数3)函数都读取并更新第一个参数(zeroValue)并返回它,而不是创建新的返回值,以避免额外的内存分配。这对于小规模操作来说可以忽略不计,但对于在具有数百个节点的集群上运行的大规模操作来说,这将是一种节省内存的技术


因此,它将是一个任意值,根据在合并和合并中执行的操作类型选择,以不影响实际结果(0表示加法(或)1表示乘法)

如果initialValue始终为零,它的用途是什么?如果我给0,它将返回[(hello,4)],这是正确的。然而,如果我把它设为1,我期望结果是[(你好,5)],然而它是[(你好,6)]。它尝试将其设置为2,然后结果变为[(hello,8)]。因此,在结果中添加2*initialValue不应为casespark.default。spark本地模式的并行度是核心数,因此假设您的电脑有2个核心的处理器。因此默认值是2。因此,并行分布式数据上并行调用的合并值导致(defaultZero(1)+数据和(1+1))+(defaultZero(1)+数据和(1+1))=6,而不是(defaultZero(1)+defaultZero(1+1+1)),如果将spark.default.parallelism设置为1,则为5,它将产生5的结果,它定义了输出类型。尝试将spark.default.parallelism设置为1 SparkConf conf=new SparkConf().setMaster(“local[2]”)。setAppName(“TestRdd”).set(“spark.default.parallelism”,“1”);但还是一样的结果
Aggregate by key [(hello,6)]