在火花RDD中拆分字符串

时间:2016-12-08 23:29:29

标签: scala apache-spark rdd

我有一个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条记录和数组中的所有值。

2 个答案:

答案 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)))