繁体   English   中英

Spark - 使用正则表达式从字母数字字符串中提取数值

[英]Spark - extracting numeric values from an alphanumeric string using regex

我有一个名为“Result”的字母数字列,我想将其解析为 4 个不同的列:前缀、后缀、值和纯文本。

我想使用 Spark SQL 使用 RLIKE 和 REGEX 来解决这个问题,但也对 PySpark/Scala 开放

pure_text :仅包含字母(或)如果存在数字,则它们应该具有特殊字符“-”或多个小数(即 9.9.0)或数字后跟字母然后再次数字(即 3x4u)

前缀:任何不能归类为“纯文本”的内容都将被考虑在内。 需要提取第一个数字 [0-9] 之前的任何字符。

suffix :任何不能归类为“pure_text”的内容都将被考虑在内。 需要提取最后一位数字 [0-9] 之后的任何字符。

value :任何不能归类为“pure_text”的内容都将被考虑在内。 提取包括小数点在内的所有数值。

Result 

11 H
111L
<.004
>= 0.78
val<=0.6
xyz 100 abc
1-9
aaa 100.3.4 
a1q1

预期输出:

Result         Prefix     Suffix   Value    Pure_Text

11 H                           H      11
111L                           L     111       
.9                                   0.9
<.004               <              0.004
>= 0.78            >=               0.78
val<=0.6        val<=                0.6
xyz 100 abc      xyz         abc     100
1-9                                              1-9
aaa 100.3.4                              aaa 100.3.4 
a1q1                                            a1q1

这是使用 UDF 的一种方法,该方法应用模式匹配将字符串内容提取到 case 类中。 周围的数字图案匹配中心value与正则表达式模式[+-]?(?:\\d*\\.)?\\d+提取像“1.23”,” 0.99" , “ - 100”号的第一次出现,等。随后对suffix捕获的剩余子串中的数字进行检查,以确定原始字符串中的数字子串是否合法。

import org.apache.spark.sql.functions._
import spark.implicits._

case class RegexRes(prefix: String, suffix: String, value: Option[Double], pure_text: String)

val regexExtract = udf{ (s: String) =>
  val pattern = """(.*?)([+-]?(?:\d*\.)?\d+)(.*)""".r
  s match {
    case pattern(pfx, num, sfx) =>
      if (sfx.exists(_.isDigit))
        RegexRes("", "", None, s)
      else
        RegexRes(pfx, sfx, Some(num.toDouble), "")
    case _ =>
      RegexRes("", "", None, s)
  }
}

val df = Seq(
  "11 H", "111L", ".9", "<.004", ">= 0.78", "val<=0.6", "xyz 100 abc", "1-9", "aaa 100.3.4", "a1q1"
).toDF("result")

df.
  withColumn("regex_res", regexExtract($"result")).
  select($"result", $"regex_res.prefix", $"regex_res.suffix", $"regex_res.value", $"regex_res.pure_text").
  show
// +-----------+------+------+-----+-----------+
// |     result|prefix|suffix|value|  pure_text|
// +-----------+------+------+-----+-----------+
// |       11 H|      |     H| 11.0|           |
// |       111L|      |     L|111.0|           |
// |         .9|      |      |  0.9|           |
// |      <.004|     <|      |0.004|           |
// |    >= 0.78|   >= |      | 0.78|           |
// |   val<=0.6| val<=|      |  0.6|           |
// |xyz 100 abc|  xyz |   abc|100.0|           |
// |        1-9|      |      | null|        1-9|
// |aaa 100.3.4|      |      | null|aaa 100.3.4|
// |       a1q1|      |      | null|       a1q1|
// +-----------+------+------+-----+-----------+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM