Pyspark: фильтровать dataframe с помощью регулярного выражения с форматированием строки?
Я прочитал несколько сообщений об использовании оператора "like" для фильтрации фреймового блока данных по условию содержанию строки/выражения, но задавался вопросом, является ли следующее "наилучшей практикой" при использовании% 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. В противном случае, для точных совпадений нам не понадобится окружающих процентных знаков "%".
Ответы
Ответ 1
Из подсказки neeraj кажется, что правильный способ сделать это в pyspark:
expr = "Arizona.*hot"
dk = dx.filter(dx["keyword"].rlike(expr))
Обратите внимание, что dx.filter($"keyword"...)
не работает, поскольку (моя версия) pyspark, похоже, не поддерживает $
nomenclature из коробки.
Ответ 2
Попробуйте функцию rlike, как указано ниже.
df.filter(<column_name> rlike "<regex_pattern>")
например.
dk = dx.filter($"keyword" rlike "<pattern>")
Ответ 3
Я использовал следующее для отметки времени регулярное выражение
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))