【问题标题】:Splitting a string in spark RDD在火花 RDD 中拆分字符串
【发布时间】:2016-12-08 23:29:29
【问题描述】:

我有一个 RDD[Long,String]。一个示例 RDD 如下 -

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

我想将此 rdd 转换为 sr.no 列表。输出应该是这样的-

(123, [1,2])

我在 scala 中使用 flatmap 方法进行了尝试,但我只想要“123”的 1 条记录以及数组中的所有值。

【问题讨论】:

    标签: scala apache-spark rdd


    【解决方案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")
    

    【讨论】:

      【解决方案2】:

      您可以使用regex 提取sr.no: 之后的数字,look-behind 语法(?<=):

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

      【讨论】:

      • 你在这里不必要地调用map而不是mapValues,后者是更好的做法。
      猜你喜欢
      • 2018-04-26
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 2017-02-21
      • 2017-02-28
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      相关资源
      最近更新 更多