首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spark Group By Key to (Key,List)对

Spark Group By Key to (Key,List)对
EN

Stack Overflow用户
提问于 2015-12-18 05:20:39
回答 2查看 27.4K关注 0票数 14

我正在尝试按键对一些数据进行分组,其中值将是一个列表:

示例数据:

代码语言:javascript
复制
A 1
A 2
B 1
B 2

预期结果:

代码语言:javascript
复制
(A,(1,2))
(B,(1,2))

我可以用下面的代码做到这一点:

代码语言:javascript
复制
data.groupByKey().mapValues(List(_))

问题是,当我尝试执行如下Map操作时:

代码语言:javascript
复制
groupedData.map((k,v) => (k,v(0))) 

它告诉我我有错误的参数数量。

如果我尝试:

代码语言:javascript
复制
groupedData.map(s => (s(0),s(1)))

它告诉我"(Any,List(Iterable(Any)不带参数“

不知道我做错了什么。我的分组有错吗?有什么更好的方法可以做到这一点?

请只回答Scala问题。谢谢!!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-18 05:28:03

你就快到了。只需用_.toList替换List(_)即可

代码语言:javascript
复制
data.groupByKey.mapValues(_.toList)
票数 20
EN

Stack Overflow用户

发布于 2015-12-18 05:37:17

当您编写表单的匿名内联函数时

代码语言:javascript
复制
ARGS => OPERATION

箭头前面的整个部分(=>)被用作参数列表。因此,在这种情况下

代码语言:javascript
复制
(k, v) => ...

解释器认为这意味着一个带有两个参数的函数。然而,在本例中,您有一个恰好是一个元组的参数(这里是一个Tuple2Pair -更完整地说,您似乎有一个Pair[Any,List[Any]]列表)。有几种方法可以解决这个问题。首先,您可以使用加糖的形式表示一个对,用一组额外的圆括号表示,以表明这是函数的单个预期参数:

代码语言:javascript
复制
((x, y)) => ...

或者,您可以以匹配元组的部分函数的形式编写匿名函数:

代码语言:javascript
复制
groupedData.map( case (k,v) => (k,v(0)) ) 

最后,您可以简单地使用一个指定的参数,就像您最后一次尝试一样,但是-意识到它是一个元组-引用您需要的元组中的特定字段:

代码语言:javascript
复制
groupedData.map(s => (s._2(0),s._2(1)))  // The key is s._1, and the value list is s._2   
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34344455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档