#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|
-------------------- ---