Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Pyspark: фильтровать кадр данных по регулярному выражению с форматированием строки?

Автор вопроса: QuetzalcoatlОтветов: 3

Я прочитал несколько сообщений об использовании оператора "нравится" для фильтрации кадра данных искры по условию содержания строки/выражения, но мне было интересно, является ли следующая "наилучшей практикой" использование% s в желаемом состоянии как следует:

input_path = <s3_location_str>
my_expr = "Arizona.*hot"  # a regex expression
dx = sqlContext.read.parquet(input_path)  # "keyword" is a field in dx

# is the following correct?
substr = "'%%%s%%'" %my_keyword  # escape % via %% to get "%"
dk = dx.filter("keyword like %s" %substr)

# dk should contain rows with keyword values such as "Arizona is hot."

Примечание

Я пытаюсь получить все строки в dx, которые содержат выражение my_keyword. В противном случае для точных совпадений нам не понадобились бы окружающие знаки процента '%'.

regexpysparkapache-spark-sqlpyspark-sqlspark-dataframe

Ответы

Ответ 1 · рейтинг 33 · Quetzalcoatl

Из подсказки neeraj кажется, что правильный способ сделать это в pyspark:

expr = "Arizona.*hot"
dk = dx.filter(dx["keyword"].rlike(expr))

Обратите внимание, что dx.filter($"keyword" ...) не работает, так как (моя версия) pyspark, похоже, не поддерживает номенклатуру $ из коробки.

Ответ 2 · рейтинг 12 · neeraj bhadani

Попробуйте функцию rlike, как указано ниже.

df.filter(<column_name> rlike "<regex_pattern>")

Например.

dk = dx.filter($"keyword" rlike "<pattern>")

Ответ 3 · рейтинг 4 · Dheeraj

Я использовал следующее для регулярного выражения временной метки

expression = r'[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[01][0-9]):[0-5][0-9]:[0-5][0-9]'
df1 = df.filter(df['eta'].rlike(expression))

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы