2016-12-08 3 views
0

私はRDD [Long、String]を持っています。 RDDのサンプルは、次のとおりです。スパークRDDの文字列を分割する

(123, name:abc,sr.no:1,name:def,sr.no:2) 

このrddをsr.noのリストに変換します。出力はthis-

(123, [1,2]) 

のようになります。私はflatmapアプローチとScalaでこれを試してみましたが、私は1枚のだけ、「123」のレコードと、アレイ内のすべての値を求めています。

答えて

1

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") 
0

をあなたはルック背後構文(?<=)sr.no:後に数字を抽出するためにregexを使用することができます。

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))) 
+0

ここで不必要に 'mapValues'の代わりに' map'を呼びますが、後者はより良い方法です。 – Tim

+0

@TimPいい点、指摘ありがとう。 – Psidom