如何在scala中生成的键值对中添加值
如何从spark 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
(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 toInt
或您需要的任何其他数字类型
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中,然后执行它,那么打印方法就不行了?