Scala 在spark RDD中拆分字符串

Scala 在spark RDD中拆分字符串,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我有一个RDD[长字符串]。样本RDD如下所示: (123, name:abc,sr.no:1,name:def,sr.no:2) 我想把这个rdd转换成一个sr.no的列表。输出应该如下所示- (123, [1,2]) 我在scala中使用flatmap方法尝试了这一点,但我只希望“123”和数组中的所有值有一条记录 如果使用mapValues,您将保留记录数。下面是一个简单的函数,它可以满足您的需要: scala> def foo(s: String, pattern: Strin

我有一个RDD[长字符串]。样本RDD如下所示:

(123, name:abc,sr.no:1,name:def,sr.no:2)
我想把这个rdd转换成一个sr.no的列表。输出应该如下所示-

(123, [1,2])

我在scala中使用flatmap方法尝试了这一点,但我只希望“123”和数组中的所有值有一条记录

如果使用
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)
现在您可以拨打:

rdd.mapValues(foo(_, "sr.no")

如果使用
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)
现在您可以拨打:

rdd.mapValues(foo(_, "sr.no")

您可以使用
regex
提取
sr.no:
后向语法
(?您可以使用
regex
提取
sr.no:
后向语法
(?你在这里不必要地调用
map
而不是
mapValues
,后者是更好的练习。你在这里不必要地调用
map
而不是
mapValues
,后者是更好的练习。