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

如何在scala中生成的键值对中添加值,scala,apache-spark,bigdata,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

如何从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( _+ _)

reduceByKey
在这里不起作用。请使用
foldLeft

请参阅以解决您的问题

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
,因为我有更多的经验。

你可以使用
reduce
fold
来获得结果,你还需要转换
标记(4)
value to
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)) 
使用reduce

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)) 

希望这有帮助

您也可以发布示例数据吗?第1:10-10-2010行Chennai VMall Raju 10000第2:10-11-2010行Hyderabad CRMall Ram 5000等等..如果我使用上面的reduce方法,saveAsTextFile不工作,抛出提示,就像它不是(Float,Int)的成员一样saveAsTextFile是在rdd上执行的,但是您已经用reduce或fold执行了一个操作,所以这会给您(Int,Float)您能解释一下在折叠或reduce之后如何保存和查看结果吗?将其分配给一个变量并打印它,但是如果我们使用可执行jar,比如将程序导出到jar中,然后执行它,那么打印方法就不行了?