Spark Group By Key(Key,List)Pair

时间:2015-12-17 21:20:39

标签: scala apache-spark

我正在尝试按密钥对某些数据进行分组,其中值为列表:

示例数据:

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))不接受参数”

不知道我做错了什么。我的分组错了吗?什么是更好的方法呢?

斯卡拉只是请回答。谢谢!

2 个答案:

答案 0 :(得分:16)

你快到了。只需将List(_)替换为_.toList

即可
data.groupByKey.mapValues(_.toList)

答案 1 :(得分:3)

当您编写表格

的匿名内联函数时
ARGS => OPERATION

将箭头(=>)之前的整个部分作为参数列表。所以,在

的情况下
(k, v) => ...

解释器将其视为一个带有两个参数的函数。但是,在您的情况下,您有一个恰好是元组的参数(此处为Tuple2Pair - 更完整地说,您似乎有一个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