【问题标题】:How to unpack a map/list in scala to tuples for a variadic function?如何将scala中的地图/列表解压缩为可变参数函数的元组?
【发布时间】:2015-11-16 20:11:49
【问题描述】:

我正在尝试在 spark 中创建一个 PairRDD。为此,我需要一个 tuple2 RDD,例如 RDD[(String, String)]。但是,我有一个RDD[Map[String, String]]

我不知道如何摆脱可迭代,所以我只剩下RDD[(String, String)] 而不是例如RDD[List[(String, String)]].

我正在尝试制作的一个简单演示是这个损坏的代码:

val lines = sparkContext.textFile("data.txt")
val pairs = lines.map(s => Map(s -> 1))
val counts = pairs.reduceByKey((a, b) => a + b)

最后一行不起作用,因为 pairs 在需要是 RDD[(String, Int)] 时是 RDD[Map[String, Int]]

那么我怎样才能摆脱上面pairs 中的可迭代项以将 Map 转换为只是一个 tuple2?

【问题讨论】:

  • 正如我在回答中已经写的:为什么要为每个单词创建一个新的Map。这似乎不是故意的。请仔细阅读我的(修订后的包括证明)答案。使用s => (s,1) 而不是Map( s-> 1) 。如果我的回答不符合您的要求,请简明扼要地重新表述您的问题。谢谢!
  • 这是说明问题的示例代码,而不是包含我的复杂代码。显然,如果没有地图,就没有问题,也没有问题。第 3 行的问题由接受的答案解决。你的通过更改没有帮助的示例代码来避免这个问题。

标签: scala apache-spark


【解决方案1】:

你实际上可以运行:

val counts = pairs.flatMap(identity).reduceByKey(_ + _)

请注意,在 RDD 上复制 flatten 的功能的 identity 函数的使用和 reduceByKey() 函数为了简洁而使用漂亮的下划线表示法。

【讨论】:

  • 是的,你的建议也解决了这个问题。但是我在删除“不必要的”和最可能不需要的 Map(...) 创建方面的修复似乎是一个更容易的解决方案....
猜你喜欢
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
  • 2018-07-04
  • 2014-08-03
  • 2016-04-09
  • 2015-08-24
相关资源
最近更新 更多