Повторите, чтобы получить подстроку

#python #apache-spark #pyspark #apache-spark-sql

Вопрос:

Я пытаюсь выполнить итерацию через фрейм данных pyspark и получить значения после определенной позиции. Данные будут примерно такими:

введите описание изображения здесь

Мне нужно значение между . и (пробелом) в каждой строке. Пример для SNO=1 того , что мне нужно 1 .

Я попытался написать приведенный ниже код, и в нем говорится, что столбец не может быть повторен

 df3 = df2.withColumn("value", substring(df2.ColumnValue,instr(df2.ColumnValue,
'.')   1, instr(df2.ColumnValue, ' ') - instr(df2.ColumnValue, '.') - 1))
 

Может кто-нибудь, пожалуйста, помочь?

Комментарии:

1. substring функция принимает значения int для position length параметров и, но вы передаете столбец. Если вы хотите передать столбец, используйте его с выражением SQL: expr("substring(ColumnValue, instr(ColumnValue, '.') 1, instr(ColumnValue, ' ') - instr(ColumnValue, '.') - 1)") . Или проще, разделив, как указано в приведенном выше ответе.

2. По какой-то причине это не сработало 🙁

Ответ №1:

REGEXP_EXTRACT должен сделать свое дело:

regexp_EXTRACT(<column>,<regex>,<group>)

Для вашего регулярного выражения попробуйте (?<=.)(.*?)(?= ) . Это использование look aheads и look behinds. Вот отличная ссылка, которая объясняет это намного лучше, чем я могу.

Ответ №2:

Как сказал @Andrew, regexp_extract это лучший выбор в данном случае. И мое регулярное выражение немного другое [^.] .([^s] ) . Вы можете поиграть с ним здесь https://regex101.com/r/cBtiT7/1

 from pyspark.sql import functions as F

df.withColumn('a', F.regexp_extract('col', '[^.] .([^s] )', 1)).show()

 -------------------- --- 
|                 col|  a|
 -------------------- --- 
|    H1.1 Hello World|  1|
|H02.11 Hello World 2| 11|
 -------------------- ---