我有一个RDD [Long,String]。样本RDD如下 -
(123, name:abc,sr.no:1,name:def,sr.no:2)
我想将此rdd转换为sr.no列表。输出应该如下所示 -
(123, [1,2])
我使用flatmap方法在scala中尝试了这个,但我只想要“123”的1条记录和数组中的所有值。
答案 0 :(得分:1)
如果您使用area
,则会保留记录数。这是一个天真的功能,可以做你想要的:
mapValues
现在你可以致电:
scala> def foo(s: String, pattern: String): Array[String] = s.split(",").filter(_.contains(pattern)).map(_.split(":").last)
foo: (s: String)Array[String]
scala> foo("name:abc,sr.no:1,name:def,sr.no:2", "sr.no")
res3: Array[String] = Array(1, 2)
答案 1 :(得分:0)
您可以使用regex
使用 look-behind 语法sr.no:
提取(?<=)
后的数字:
val p = "(?<=sr.no:)\\d+".r
# p: scala.util.matching.Regex = (?<=sr.no:)\d+
rdd.map{case (x, y) => (x, p.findAllIn(y).toList)}.collect()
# res10: Array[(Int, List[String])] = Array((123,List(1, 2)))
或者@Tim发表评论时,请使用mapValues()
:
rdd.mapValues(p.findAllIn(_).toList).collect()
# res11: Array[(Int, List[String])] = Array((123,List(1, 2)))