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

Rem*_*bel 5 scala key list apache-spark

我有以下列方式格式化的数据:

DataRDD = [(String, List[String])]
Run Code Online (Sandbox Code Playgroud)

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

DataRDD = [(1, [a, b, c]), 
           (2, [d, e]),
           (3, [a, e, f])]
Run Code Online (Sandbox Code Playgroud)

然后我希望结果如下:

DataKV  = [(1, a),
           (1, b),
           (1, c),
           (2, d),
           (2, e),
           (3, a),
           (3, e),
           (3, f)]
Run Code Online (Sandbox Code Playgroud)

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

DataID  = [(1, [3]),
           (2, [3]),
           (3, [1, 2])]
Run Code Online (Sandbox Code Playgroud)

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

Osc*_*car 14

这绝对是一个经常出现的新手问题.解决方案是使用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
Run Code Online (Sandbox Code Playgroud)

这将提供所需的解决方案

Array((1,a), (1,b), (1,c), (2,d), (2,e), (3,a), (3,e), (3,f))
Run Code Online (Sandbox Code Playgroud)