man*_*jam 11 scala apache-spark
我试图按键将一些数据分组,其中值为列表:
样本数据:
A 1
A 2
B 1
B 2
Run Code Online (Sandbox Code Playgroud)
预期结果:
(A,(1,2))
(B,(1,2))
Run Code Online (Sandbox Code Playgroud)
我可以使用以下代码执行此操作:
data.groupByKey().mapValues(List(_))
Run Code Online (Sandbox Code Playgroud)
问题是当我尝试执行如下的Map操作时:
groupedData.map((k,v) => (k,v(0)))
Run Code Online (Sandbox Code Playgroud)
它告诉我我的参数数量是错误的.
如果我尝试:
groupedData.map(s => (s(0),s(1)))
Run Code Online (Sandbox Code Playgroud)
它告诉我"(Any,List(Iterable(Any))不带参数"
不知道我做错了什么.我的分组错了吗?什么是更好的方法来做到这一点?
斯卡拉只是请回答.谢谢!!
zer*_*323 18
你快到了.只需更换List(_)与_.toList
data.groupByKey.mapValues(_.toList)
Run Code Online (Sandbox Code Playgroud)
当您编写表单的匿名内联函数时
ARGS => OPERATION
Run Code Online (Sandbox Code Playgroud)
将箭头 ( =>)之前的整个部分作为参数列表。所以,在这种情况下
(k, v) => ...
Run Code Online (Sandbox Code Playgroud)
解释器认为这是一个带有两个参数的函数。但是,在您的情况下,您有一个参数恰好是一个元组(在这里, aTuple2或 a Pair- 更完整地说,您似乎有一个 的列表Pair[Any,List[Any]])。有几种方法可以解决这个问题。首先,您可以使用表示一对的加糖形式,用一组额外的括号括起来,以表明这是函数的单个预期参数:
((x, y)) => ...
Run Code Online (Sandbox Code Playgroud)
或者,您可以以匹配元组的部分函数的形式编写匿名函数:
groupedData.map( case (k,v) => (k,v(0)) )
Run Code Online (Sandbox Code Playgroud)
最后,您可以根据上次尝试简单地使用单个指定参数,但是 - 意识到它是一个元组 - 引用您需要的元组中的特定字段:
groupedData.map(s => (s._2(0),s._2(1))) // The key is s._1, and the value list is s._2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23152 次 |
| 最近记录: |