经过一些转换后,这是我拥有的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)
这是我得到的输出:
()
()
()
()
()
()
()
怎么做?
这里非常漂亮的答案,但我已经错过了一个我认为可以轻松击败他们全部:)而这也正是为什么我爱斯卡拉-以其灵活性。
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句