Spark sql regexp_提取选择数字错误

Spark sql regexp_提取选择数字错误,regex,pyspark,pyspark-sql,Regex,Pyspark,Pyspark Sql,你好,StackOverflow的人们 我正试图从house number中提取一个数字,但由于某些原因我无法提取。我有一个来自teradata的工作代码,我正试图将其转换为pyspark: --Original code from teradata: CAST(REGEXP_SUBSTR(adr_house_no, '\d+') AS INTEGER) AS adr_house_no, REGEXP_SUBSTR(adr_house_no, '[A-Za-z]+$') AS adr_hous

你好,StackOverflow的人们
我正试图从house number中提取一个数字,但由于某些原因我无法提取。
我有一个来自teradata的工作代码,我正试图将其转换为pyspark:

--Original code from teradata:
CAST(REGEXP_SUBSTR(adr_house_no, '\d+') AS INTEGER) AS adr_house_no, 
REGEXP_SUBSTR(adr_house_no, '[A-Za-z]+$') AS adr_house_no_ad
以下是我正在使用的查询:

result = spark.sql('''

    SELECT
        adr_house_no as house_no,
        CAST(regexp_extract(adr_house_no, '(\d+)') AS INT) as adr_house_no,
        regexp_extract(adr_house_no, '([A-Za-z]+$)') as adr_house_no_ad
    FROM subscriber_info_address_subscriber

    ''').show()
结果如下:

+--------+------------+---------------+
|house_no|adr_house_no|adr_house_no_ad|
+--------+------------+---------------+
| LTECXYD|        null|        LTECXYD|
| LTECXYD|        null|        LTECXYD|
|     51l|        null|              l|
|     84J|        null|              J|
|     96t|        null|              t|
|     919|        null|               |
|     59e|        null|              e|
|     919|        null|               |
| LTECXYD|        null|        LTECXYD|
|     67s|        null|              s|
|     4-6|        null|               |
|     361|        null|               |
| LTECXYD|        null|        LTECXYD|
| LTECXYD|        null|        LTECXYD|
| LTECXYD|        null|        LTECXYD|
|     842|        null|               |
| LTECXYD|        null|        LTECXYD|
|     98r|        null|              r|
|     361|        null|               |
| LTECXYD|        null|        LTECXYD|
+--------+------------+---------------+

提取房屋信件的部分是有效的,但由于某种原因,我无法标记任何数字。我尝试了选择一个数字
\d
或两个。
我尝试了
regexp\u提取(adr\u house\u no,“\d+”)
但没有括号,但也不起作用
有效的是
regexp\u提取(adr\u房屋编号,[0-9]+)

为什么?为什么pyspark中的
\d
不起作用?

因为在正则表达式中,parantasis表示分组。您还必须提到分组号,即要提取的组号。分组编号从一开始。假设您的模式包含3个组,您需要提取第2个组,然后您提到2个组

在您的情况下,有一个组,您需要这个组。因此,您需要编写为regexp\u extract('adr\u house\u no','(\d+),1)

还要注意regexp_extract(str、pattern、idx)的语法
从指定的字符串列中提取由java正则表达式标识的特定(idx)组。

您好,我已经解决了这个问题

因为您是以sql格式编写的,所以sql没有\d选项,因此它不提供任何值。因此,您需要以“[0-9]+”的形式写入以获取任何数字

在您的情况下,请按以下方式更换:

spark.sql("SELECT adr_house_no as house_no, CAST(regexp_extract(adr_house_no, '([0-9]+)',1) AS INT) as adr_house_no, regexp_extract(adr_house_no, '([A-Za-z]+$)',1) as adr_house_no_ad FROM subscriber_info_address_subscriber").show()
或者,如果您想使用python的正则表达式,则需要在数据帧中编写代码,如下所示:

df.withColumn('house_no',regexp_extract('adr_house_no','(\d+)',1).cast('int')).withColumn('adr_house_no_ad',regexp_extract('adr_house_no', '([A-Za-z]+$)',1)).show()

实际上,sql格式支持\d,但它需要在字符串之前添加r和双反斜杠,例如

result = spark.sql(r'''

    SELECT
        adr_house_no as house_no,
        CAST(regexp_extract(adr_house_no, '(\\d+)') AS INT) as adr_house_no,
        regexp_extract(adr_house_no, '([A-Za-z]+$)') as adr_house_no_ad
    FROM subscriber_info_address_subscriber

    ''').show()

因为
regexp\u extract(adr\u house\u no,'\\d+')
有作用吗?它也不起作用:/这是我尝试的第一件事,参数idx是可选的。但还是不行。问题出在自己身上。请让我知道它是否对您有效。谢谢您对问题和解决方案的关注。正如我所写的,我知道“([0-9]+)”会起作用。您知道为什么sql格式不支持\d吗?其实很有趣,为什么不是呢