在Spark / Scala中取消组合(键,列表(值))对

时间:2014-11-18 06:56:40

标签: list scala key apache-spark

我的数据格式如下:

DataRDD = [(String, List[String])]

第一个字符串表示键,列表包含值。请注意,每个键的值数量不同(但绝不为零)。我希望以这样一种方式映射RDD,即列表中的每个元素都有一个键值对。为了澄清这一点,想象整个RDD如下:

DataRDD = [(1, [a, b, c]), 
           (2, [d, e]),
           (3, [a, e, f])]

然后我希望结果是:

DataKV  = [(1, a),
           (1, b),
           (1, c),
           (2, d),
           (2, e),
           (3, a),
           (3, e),
           (3, f)]

因此,我想返回具有相同值的所有键组合。即使没有相同的值,也可以将其返回到每个键的列表中:

DataID  = [(1, [3]),
           (2, [3]),
           (3, [1, 2])]

由于我对Spark和Scala相当陌生,所以我还没有完全掌握他们的概念,因此我希望你们中的任何人都可以帮助我。即使它只是其中的一部分。

1 个答案:

答案 0 :(得分:13)

这绝对是一个经常出现的新手问题。解决方案是使用flatMapValues

val DataRDD = sc.parallelize(Array((1, Array("a", "b", "c")), (2, Array("d", "e")),(3, Array("a", "e", "f"))))

DataRDD.flatMapValues(x => x).collect

哪个会提供所需的解决方案

Array((1,a), (1,b), (1,c), (2,d), (2,e), (3,a), (3,e), (3,f))