如何在 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】:您可以使用reduce
或fold
来获得结果,您还需要根据需要将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)