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 '%'.
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.
Essayez la fonction rlike comme mentionné ci-dessous.
df.filter(<column_name> rlike "<regex_pattern>")
par exemple.
dk = dx.filter($"keyword" rlike "<pattern>")
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))