我的数据格式如下:
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相当陌生,所以我还没有完全掌握他们的概念,因此我希望你们中的任何人都可以帮助我。即使它只是其中的一部分。
答案 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))