web-dev-qa-db-fra.com

Pyspark: filtrer la trame de données par expression régulière avec un formatage de chaîne?

J'ai lu plusieurs articles sur l'utilisation de l'opérateur "like" pour filtrer un spark dataframe par la condition de contenir une chaîne/expression, mais je me demandais si ce qui suit est une "meilleure pratique" sur l'utilisation de% s dans la condition souhaitée comme suit:

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."

Remarque

J'essaie d'obtenir toutes les lignes dans dx qui contiennent l'expression my_keyword. Sinon, pour des correspondances exactes, nous n'aurions pas besoin des signes de pourcentage entourant '%'.

12
Quetzalcoatl

D'après l'indice de neeraj, il semble que la bonne façon de le faire dans pyspark soit:

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

Notez que dx.filter($"keyword" ...) ne fonctionnait pas car (ma version) de pyspark ne semblait pas prendre en charge la nomenclature $ Prête à l'emploi.

20
Quetzalcoatl

Essayez la fonction rlike comme mentionné ci-dessous.

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

par exemple.

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

J'ai utilisé ce qui suit pour l'expression régulière d'horodatage

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))
1
Dheeraj