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

Posted

技术标签:

【中文标题】如何在 scala 中生成的键值对中添加值【英文标题】:How can I add values in key value pairs generated in scala 【发布时间】:2018-07-12 17:37:37 【问题描述】:

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

【问题讨论】:

您也可以发布示例数据吗? Row 1:10-10-2010 Chennai VMall Raju 10,000 Row 2:10-11-2010 Hyderabad CRMall Ram 5000 等等.. 【参考方案1】:

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

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

使用折叠

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

使用reduce

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

希望这会有所帮助!

【讨论】:

如果我使用上面的 reduce 方法,saveAsTextFile 无法正常工作,会抛出提示,就像它不是 (Float,Int) 的成员一样 saveAsTextFile 是在 rdd 上执行的,但您已经使用 reduce 或 fold 执行了一个操作,所以这给了您 (Int, Float) 你能解释一下如何保存和查看折叠或缩小后的结果吗? 赋值给一个变量并打印出来 但是如果我们使用可执行jar,比如将我们的程序导出到jar中然后执行它,那么打印方法将无法正常工作?【参考方案2】:

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

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

【讨论】:

【参考方案3】:
val spark = SparkSession.builder.appName("myapp").getOrCreate()   
val data = spark.read.textFile(args(0)).rdd  
val result = data.mapline =>   
  val tokens = line.split("\t")  
  (tokens(4).toInt,1)  
  
.reduce((l, r) => (l._1+r._1, l._2+r._2))

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

【讨论】:

以上是关于如何在 scala 中生成的键值对中添加值的主要内容,如果未能解决你的问题,请参考以下文章

将一个字典内的内value转换为集合:返回一个数组,此数组中包含输入字典的键值对中的数组的所有元素(为NSArray添加category)

javascript键值对中的key可以是变量吗?

java 怎么样获取Map中第几个键值对

java问题,我想在java中存储键值对,以便使用,但是键值对的键和值都有重复元素,使用hashmap会产生覆盖。

如何从字典列表中向现有键值对添加新的键值对?

java如何对一堆键值对数据分组