regexp\u替换spark.sql()

ws51t4hk  于 2021-07-12  发布在  Spark
关注(0)|答案(1)|浏览(498)

我需要为spark.sql()作业编写一个regexp\u replace查询。如果值遵循下面的模式,则仅提取第一个连字符之前的单词并将其分配给目标列“name”,但如果模式不匹配,则应报告整个“name”。
图案:
值应以连字符分隔。任何值都可以出现在第一个连字符之前(可以是数字、字母、特殊字符甚至空格)
第一个连字符后面应紧跟两个单词,用连字符隔开(只能是数字、字母或字母数字)(注:不允许使用特殊字符和空格)
两个单词后面应该跟一个或多个数字,后面应该跟连字符。
最后一部分只能是一个或多个数字。
例如:
如果name=45-dsg5-gfdvh6-9890-7685,regexp\u replace的输出=45
如果name=,则regexp\u replace=的输出
如果name=-gf5-dfg5-asd5-98-00,则regexp\u的输出replace=-gf5-dfg5-asd5-98-00
我有

spark.sql("SELECT REGEXP_REPLACE(name , '-[^-]+-\\w{2}-\\d+-\\d+$','',1,1,'i')  AS name").show();

但它不起作用。

cwdobuhd

cwdobuhd1#

使用

^([^-]*)(-[a-zA-Z0-9]+){2}-[0-9]+-[0-9]+$

见证据。替换为 $1 . 如果 $1 不起作用,使用 \1 . 如果 \1 不工作使用 \\1 .
解释

--------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    [^-]*                    any character except: '-' (0 or more
                             times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  (                        group and capture to \2 (2 times):
--------------------------------------------------------------------------------
    -                        '-'
--------------------------------------------------------------------------------
    [a-zA-Z0-9]+             any character of: 'a' to 'z', 'A' to
                             'Z', '0' to '9' (1 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
  ){2}                     end of \2 (NOTE: because you are using a
                           quantifier on this capture, only the LAST
                           repetition of the captured pattern will be
                           stored in \2)
--------------------------------------------------------------------------------
  -                        '-'
--------------------------------------------------------------------------------
  [0-9]+                   any character of: '0' to '9' (1 or more
                           times (matching the most amount possible))
--------------------------------------------------------------------------------
  -                        '-'
--------------------------------------------------------------------------------
  [0-9]+                   any character of: '0' to '9' (1 or more
                           times (matching the most amount possible))
--------------------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string

相关问题