按索引

时间:2016-10-27 18:43:52

标签: scala apache-spark

我有特定格式的数据,其中RDD中的每个元素都是一个数组数组。数组中的第一个元素是键,其后的两个元素是与该键相关联的值。如何通过第一个数组索引聚合这些值?

这是一个示例输入:

Array[Array[Any]] = Array(Array(490, [490], 23225), Array(64, [64], 48262), Array(64, [64,11], 30677), Array(64, [64,11,6], 29865), Array(64, [64,3], 21175), Array(64, [64,6], 39697), Array(6, [6], 601374), Array(77, [77], 43454), Array(77, [77,11], 30409), Array(77, [77,11,6], 29830), Array(77, [77,6], 37654), Array(3, [3], 450031), Array(3, [3,6], 265180), Array(69, [69], 22631), Array(69, [69,6], 20439), Array(11, [11], 364065), Array(11, [11,3], 161286), Array(11, [11,3,6], 143682), Array(11, [11,6], 324013), Array(90, [90], 22062), Array(90, [90,6], 21288), Array(2, [2], 42927), Array(2, [2,11], 20826), Array(2, [2,6], 29619), Array(215, [215], 21592), Array(138, [138], 35127), Array(138, [138,11], 21566), Array(138, [138,11,6], 21008), Array(138, [138,6], 28750), Array(1, [...

我希望将所有具有密钥490的数组组合在一起,将具有密钥64的所有数组组合在一起,依此类推。

1 个答案:

答案 0 :(得分:1)

您可以使用group by运算符:

arr.groupBy(_.head)或longform arr.groupBy(innerArr => innerArr.head)

Array(Array(400, "sad", "sd"), Array(300, "aa", "sd"), Array(400, "dsa", "asd")) 
    .groupBy(_.head)
res0: Map[Any, Array[Array[Any]]] = Map(
  400 -> Array(Array(400, sad, sd), Array(400, dsa, asd)),
  300 -> Array(Array(300, aa, sd))
)

如果您不希望密钥保留在值列表中,您可以使用mapValues映射值以将其删除,如下所示:

arr.groupBy(_.head)
   .mapValues(_.map(_.tail))
res1: Map[Any, Array[Array[Any]]] = Map(
  400 -> Array(Array(sad, sd), Array(dsa, asd)), 
  300 -> Array(Array(aa, sd))
)