私は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」のレコードと、アレイ内のすべての値を求めています。
私は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」のレコードと、アレイ内のすべての値を求めています。
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")
をあなたはルック背後構文(?<=)
で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)))
ここで不必要に 'mapValues'の代わりに' map'を呼びますが、後者はより良い方法です。 – Tim
@TimPいい点、指摘ありがとう。 – Psidom