我正在尝试按密钥对某些数据进行分组,其中值为列表:
示例数据:
A 1
A 2
B 1
B 2
预期结果:
(A,(1,2))
(B,(1,2))
我可以使用以下代码执行此操作:
data.groupByKey().mapValues(List(_))
问题在于,当我尝试按以下方式执行Map操作时:
groupedData.map((k,v) => (k,v(0)))
它告诉我参数数量错误。
如果我尝试:
groupedData.map(s => (s(0),s(1)))
它告诉我“(Any,List(Iterable(Any))不接受参数”
不知道我做错了什么。我的分组错了吗?什么是更好的方法呢?
斯卡拉只是请回答。谢谢!
答案 0 :(得分:16)
你快到了。只需将List(_)
替换为_.toList
data.groupByKey.mapValues(_.toList)
答案 1 :(得分:3)
当您编写表格
的匿名内联函数时ARGS => OPERATION
将箭头(=>
)之前的整个部分作为参数列表。所以,在
(k, v) => ...
解释器将其视为一个带有两个参数的函数。但是,在您的情况下,您有一个恰好是元组的参数(此处为Tuple2
或Pair
- 更完整地说,您似乎有一个Pair[Any,List[Any]]
列表)。有几种方法可以解决这个问题。首先,您可以使用表示一对的含糖形式,包含在一组额外的括号中,以表明这是该函数的单个预期参数:
((x, y)) => ...
或者,您可以以与元组匹配的部分函数的形式编写匿名函数:
groupedData.map( case (k,v) => (k,v(0)) )
最后,根据您的上一次尝试,您可以简单地使用单个指定的参数,但是 - 实现它是一个元组 - 引用您需要的元组中的特定字段:
groupedData.map(s => (s._2(0),s._2(1))) // The key is s._1, and the value list is s._2