scala - 如何提取RDD中字符串的一部分?

标签 scala apache-spark rdd

经过几次转换,这是我的 RDD 的输出:

( z287570731_serv80i:7:175 , 5:Re )
( p286274731_serv80i:6:100 , 138 )
( t219420679_serv37i:2:50 , 5 )
( v290380588_serv81i:12:800 , 144:Jo )
( z292902510_serv83i:4:45 , 5:Re )

使用此数据作为输入 RDD,我想提取两个分号之间的值。

例如:

Input = ( z287570731_serv80i:7:175 , 5:Re )
Output = 7 (:7:)

这就是我尝试做的事情

    val processedRDD = tid.map{ 
    case (inString, inInt) => 
      val RegEx = """.*:([\d.]+):.*""".r
      val table_level = RegEx.findFirstIn(inString)
    }

    processedRDD.collect().foreach(println)

这是我得到的输出:

()
()
()
()
()
()
()

如何做到 Spark-way?

最佳答案

这里有非常好的答案,但我错过了一个我相信可以轻松击败所有答案的答案:) 这正是我喜欢 Scala 的原因 - 因为它的灵 active 。

解决方案

scala> val solution = rdd.
  map { case (left, right) => left }.
  map(_.split(":")).
  map { case Array(_, takeMe, _) => takeMe }.
  collect
solution: Array[String] = Array(7, 6, 2, 12, 4)

相信该解决方案在可读性和理解性方面很难被击败。它只是说明了它的作用(就像一首好诗)。

说明

以下是您的 RDD(由于 Spark SQL 的 Dataset.show,格式良好的输出)。

scala> rdd.toDF.show(false)
+-------------------------+------+
|_1                       |_2    |
+-------------------------+------+
|z287570731_serv80i:7:175 |5:Re  |
|p286274731_serv80i:6:100 |138   |
|t219420679_serv37i:2:50  |5     |
|v290380588_serv81i:12:800|144:Jo|
|z292902510_serv83i:4:45  |5:Re  |
+-------------------------+------+

// Compare to this assembler-like way and you understand why you should use Spark SQL for this
scala> rdd.foreach(println)
(z287570731_serv80i:7:175,5:Re)
(p286274731_serv80i:6:100,138)
(t219420679_serv37i:2:50,5)
(v290380588_serv81i:12:800,144:Jo)
(z292902510_serv83i:4:45,5:Re)

第一步是删除右列。模式匹配 FTW!

scala> rdd.map { case (left, right) => left }.foreach(println)
z292902510_serv83i:4:45
t219420679_serv37i:2:50
v290380588_serv81i:12:800
p286274731_serv80i:6:100
z287570731_serv80i:7:175

使用临时 RDD,您可以使用 : 作为分隔符分割字符串并获取第二个单词。再次是 Scala 的模式匹配 FTW!

val oneColumnOnly = rdd.map { case (left, right) => left }
scala> oneColumnOnly.
  map(_.split(":")).  // <-- split
  map { case Array(_, takeMe, _) => takeMe }. // <-- take the 2nd field
  foreach(println)
6
12
4
2
7

关于scala - 如何提取RDD中字符串的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44718878/

相关文章:

scala - 这个 scala 的快速排序代码中的 `@sp` 语法是什么?

apache-spark - PySpark 连接 ID,然后连接 'date' 列中的年份和月份

hadoop - 基于时间的目录结构Apache Drill

python-2.7 - 获取 Spark 中 RDD 中每个键的前 3 个值

scala - Spark : Why execution is carried by a master node but not worker nodes?

scala - 游戏框架测试。 FakeRequest 总是以空体发送(scala)

java - 如果我们缓存一个DataSet,然后将同一个DataSet缓存为表,Spark会缓存数据两次吗

python - 拆分 RDD

Scala - 在 map 的 map 上分组

r - 有没有办法使用 dplyr 用 0 填充缺失的日期?