如何在Scala中生成的键值对中添加值

时间:2018-07-12 17:37:38

标签: scala apache-spark bigdata

如何从Spark Scala中生成的键和值对中分别添加键和值?

给出以下输入

(5,1),(6,1),(8,1)

我想获得以下输出

(19,3)

这是我到目前为止尝试过的:

val spark = SparkSession.builder.appName("myapp").getOrCreate()   
val data = spark.read.textFile(args(0)).rdd  
val result =
  data.map { line => {  
    val tokens = line.split("\t")  
    (Float.parseFloat(tokens(4)),1)  
  }}.
  reduceByKey( _+ _)

3 个答案:

答案 0 :(得分:0)

reduceByKey在这里不会达到您的目的。请使用foldLeft

请参阅Scala: How to sum a list of tuples以解决您的问题。

答案 1 :(得分:0)

val spark = SparkSession.builder.appName("myapp").getOrCreate()   
val data = spark.read.textFile(args(0)).rdd  
val result = data.map{line => {  
  val tokens = line.split("\t")  
  (tokens(4).toInt,1)  
}}  
.reduce((l, r) => (l._1+r._1, l._2+r._2))

foldLeft(由Vinod Chandak建议)可能更合适,但由于我有更多经验,我倾向于使用reduce

答案 2 :(得分:0)

您可以使用reducefold来获得结果,还需要根据需要将token(4)的值转换为Int或任何其他数字类型。

val result = data.map{line => {  
  val tokens = line.split("\t")  
  (tokens(4).toInt,1)  
}} 

使用折页

result.fold((0,0)) { (acc, x) => (acc._1 + x._1, acc._2 + x._2)}

使用减少

result.reduce((x,y) => (x._1 + y._1, x._2 + y._2)) 

希望这会有所帮助!