Spark sql regexp_提取选择数字错误
你好,StackOverflow的人们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
我正试图从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吗?其实很有趣,为什么不是呢