Spark sql regexp_extract ошибка выбора цифр - PullRequest
0 голосов
/ 29 января 2020

Здравствуйте, люди из StackOverflow
Я пытаюсь извлечь номер из номера дома, но по какой-то причине не могу.
У меня есть рабочий код из 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|
+--------+------------+---------------+

Часть извлечения домашнее письмо работает, но по какой-то причине я не могу отметить любой ди git Я попытался выбрать один di git \d или два.
Я попытался regexp_extract(adr_house_no, '\d+') без скобок, но он также не работает.
Что такое работа regexp_extract(adr_house_no, '[0-9]+')
Почему это так? Почему \d не работает в pyspark?

Ответы [ 2 ]

0 голосов
/ 30 января 2020

привет, я выяснил проблему,

Так как вы пишете в формате sql, так как sql не имеет опции \ d, она не дает никакого значения. Следовательно, вам нужно написать как '[0-9] +', чтобы получить любой ди git.

. В вашем случае замените, как показано ниже:

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()
0 голосов
/ 29 января 2020

, поскольку в регулярном выражении парантез указывает на группировку. Вы должны также упомянуть номер группы, то есть номер группы, которую вы хотите извлечь. Номер группировки начинается с единицы. Предположим, что ваш шаблон содержит 3 группы, и вам нужно извлечь 2-ю группу, а затем упомянуть 2.

В вашем случае есть одна группа, и она вам нужна. Следовательно, вам нужно написать как regexp_extract ('adr_house_no', '(\ d +)', 1).

Также обратите внимание на синтаксис для regexp_extract (str, pattern, idx) Извлечь указанную группу c (idx) идентифицируется регулярным выражением java из указанного строкового столбца.

...