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 成对RDD变换_Scala_Apache Spark - Fatal编程技术网

Scala 成对RDD变换

Scala 成对RDD变换,scala,apache-spark,Scala,Apache Spark,如果我有类似的数据集: val list=list((1,1)、(1,2)、(1,3)、(2,2)、(2,1)、(3,1)、(3,3)) 我想找到每个键的平均值,所以输出应该是: (1,2)、(2,3/2)、(3,2)我可以用groupByKey、countByKey和reduceByKey来做这件事吗或者我必须使用类似下面例子的combineByKey方法:我试过使用groupByKey、countByKey和reduceByKey,但是这两种方法的组合不起作用,我想知道是否有人知道使用这三种

如果我有类似的数据集:

val list=list((1,1)、(1,2)、(1,3)、(2,2)、(2,1)、(3,1)、(3,3))

我想找到每个键的平均值,所以输出应该是:

(1,2)、(2,3/2)、(3,2)
我可以用
groupByKey、countByKey和reduceByKey来做这件事吗
或者我必须使用类似下面例子的combineByKey方法:我试过使用
groupByKey、countByKey和reduceByKey
,但是这两种方法的组合不起作用,我想知道是否有人知道使用这三种方法的方法

val result = input.combineByKey(
(v) => (v, 1),
(acc: (Int, Int), v) => (acc._1 + v, acc._2 + 1),
(acc1: (Int, Int), acc2: (Int, Int)) => (acc1._1 + acc2._1, acc1._2 + acc2._2)).  
map{ case (key, value) => (key, value._1 / value._2.toFloat) } 

result.collectAsMap().map(println(_))

您应该尝试以下方法:

val sc: SparkContext = ...
val input = sc.parallelize(List((1,1), (1,2), (1,3), (2,2), (2,1), (3,1), (3,3)))
val averages = input.groupByKey.map { case (key, values) =>
  (key, values.sum / values.size.toDouble)
}

println(averages.collect().toList) // List((1,2.0), (2,1.5), (3,2.0))

您应该尝试以下方法:

val sc: SparkContext = ...
val input = sc.parallelize(List((1,1), (1,2), (1,3), (2,2), (2,1), (3,1), (3,3)))
val averages = input.groupByKey.map { case (key, values) =>
  (key, values.sum / values.size.toDouble)
}

println(averages.collect().toList) // List((1,2.0), (2,1.5), (3,2.0))
你可以简单地使用和计算你想要的

val avgKey = input.groupByKey.map{
  case (k, v) => (k, v.sum.toDouble/v.size)
}
avgkey.collect
//res2: Array[(Int, Double)] = Array((3,2.0), (1,2.0), (2,1.5))
你可以简单地使用和计算你想要的

val avgKey = input.groupByKey.map{
  case (k, v) => (k, v.sum.toDouble/v.size)
}
avgkey.collect
//res2: Array[(Int, Double)] = Array((3,2.0), (1,2.0), (2,1.5))

使用
reduceByKey
,事先将二倍体转换为三倍体


使用
reduceByKey
,事先将二倍体转换为三倍体


哦,对了,我忘了当你使用groupByKey时,它会把值放在一个数组中,这样你就可以在这个数组中使用sum和size了!谢谢你的帮助!哦,对了,我忘了当你使用groupByKey时,它会把值放在一个数组中,这样你就可以在这个数组中使用sum和size了!谢谢你的帮助!你好,埃尔姆!很抱歉回复太晚,但您能否解释一下何时在map函数中使用
case
?它只是为了让您可以将参数写为
(k,v)
,而不必特别指定
k
v
的结构。例如,如果
k
是一个元组,如果映射中没有大小写,我将不得不写
((a1,a2),v)
?因此,从技术上讲,它只是用于模式匹配?通过
case
我们启用模式匹配,用于提取或分解数据结构,并使用花括号定义部分函数(并非所有模式都需要定义)。另一方面,元组数据结构的使用涉及使用它自己的方法(._1和._2)来获取(提取)数据项。Hello elm!很抱歉回复太晚,但您能否解释一下何时在map函数中使用
case
?它只是为了让您可以将参数写为
(k,v)
,而不必特别指定
k
v
的结构。例如,如果
k
是一个元组,如果映射中没有大小写,我将不得不写
((a1,a2),v)
?因此,从技术上讲,它只是用于模式匹配?通过
case
我们启用模式匹配,用于提取或分解数据结构,并使用花括号定义部分函数(并非所有模式都需要定义)。另一方面,元组数据结构的使用涉及使用它自己的方法(._1和._2)来获取(提取)数据项。