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
Scala Spark:如何使用reduceByKey获得与使用groupByKey相同的结果?还有其他解决方案吗?避免混乱_Scala_Apache Spark_Reduce_Rdd - Fatal编程技术网

Scala Spark:如何使用reduceByKey获得与使用groupByKey相同的结果?还有其他解决方案吗?避免混乱

Scala Spark:如何使用reduceByKey获得与使用groupByKey相同的结果?还有其他解决方案吗?避免混乱,scala,apache-spark,reduce,rdd,Scala,Apache Spark,Reduce,Rdd,我是Spark(使用1.1版)和Scala的新手。。我正在使用Scala和bit lost将我现有的Hadoop MapReduce代码转换为spark MR 我希望映射的RDD按键分组。。当我在线阅读时,有人建议我们应该避免使用groupByKey,而是使用reducedByKey。。但当我应用reduceBykey时,我并没有得到代码=>Ex所期望的给定键的值列表 val rdd = sc.parallelize(List(("k1", "v11"), ("k1", "v21"), ("k2

我是Spark(使用1.1版)和Scala的新手。。我正在使用Scala和bit lost将我现有的Hadoop MapReduce代码转换为spark MR

我希望映射的RDD按键分组。。当我在线阅读时,有人建议我们应该避免使用groupByKey,而是使用reducedByKey。。但当我应用reduceBykey时,我并没有得到代码=>Ex所期望的给定键的值列表

val rdd = sc.parallelize(List(("k1", "v11"), ("k1", "v21"), ("k2", "v21"), ("k2", "v22"), ("k3", "v31") ))
我的实际任务的“值”很大,键值对中有300多列 当我使用公共键进行分组时,会导致我想要避免的混乱

从映射的RDD=>

rdd.groupByKey()
这给了我以下输出

(k3,ArrayBuffer(v31))
(k2,ArrayBuffer(v21, v22))
(k1,ArrayBuffer(v11, v21))
但是当我使用

rdd.reduceByKey((x,y) => x+y)
我将值连接在一起,如下面所示-如果管道(“|”)或其他一些易断字符((k2,v21 | v22))会在那里,我的问题会稍微得到解决,但仍然有列表对于良好的编码实践来说是非常好的

(k3,v31)
(k2,v21v22)
(k1,v11v21)

如果您参考spark文档,请提供帮助

对于groupByKey,它说 对(K,V)对的数据集调用时,返回(K,Iterable)对的数据集 Iterable关键字在这里非常重要,当您获得值为(v21,v22)时,它是Iterable

进一步说 注意:如果您分组是为了对每个键执行聚合(如总和或平均值),则使用reduceByKey或aggregateByKey将产生更好的性能

因此,从这一点我理解的是,如果您希望返回的RDD具有iterable值,那么请使用groupByKey,如果您希望具有单一的加法值,比如SUM,那么请使用reducebyKey


现在,在元组中,如果有(String,String)=>(K1,V1),而不是(String,ListBuffer(String))=>(K1,ListBuffer(“V1”),那么如果您参考spark文档,您可能已经完成了rdd.reduceByKey((x,y)=>x+=y)

对于groupByKey,它说 对(K,V)对的数据集调用时,返回(K,Iterable)对的数据集 Iterable关键字在这里非常重要,当您获得值为(v21,v22)时,它是Iterable

进一步说 注意:如果您分组是为了对每个键执行聚合(如总和或平均值),则使用reduceByKey或aggregateByKey将产生更好的性能

因此,从这一点我理解的是,如果您希望返回的RDD具有iterable值,那么请使用groupByKey,如果您希望具有单一的加法值,比如SUM,那么请使用reducebyKey


现在在元组中,如果有(String,String)=>(K1,V1),而不是(String,ListBuffer(String))=>(K1,ListBuffer(“V1”)),那么您可能已经完成了rdd。reduceByKey((x,y)=>x+=y)

U意味着已经映射了列表的rdd,而不是类似字符串的=>=>val rdd=sc.parallelize(list(((((K1),list(“v11”),((K1),list(“v21”),((k2)上述评论中提到的reduceByKey(u+++)解决方案实际上对我有效,但我不确定它的正确方法是否意味着映射了List的rdd而不是字符串=>=>val rdd=sc.parallelize(List(((k1),List((v11)),((k1),List((v21)),(k2),List(上面评论中提到的“v21”),(“k2”,List(“v22”),(“k3”,List(“k31”)))val reduceRDD=rdd.reduceByKey(+++)解决方案实际上对我有效,但我不确定它是否正确。您可以通过此链接查看确切的实现。您可以通过此链接查看确切的实现