Coincidencia de cadenas de Python con un dataframe de Spark
Tengo un dataframe de Spark
id | ciudad| fruta | cantidad
-------------------------
0 | CA | manzana| 300
1 | CA | manzana| 100
2 | CA | naranja| 20
3 | CA | bayas | 10
Quiero obtener las filas donde las frutas sean manzana
o naranja
. Así que uso Spark SQL:
SELECT * FROM tabla WHERE fruta LIKE '%manzana%' OR fruta LIKE '%naranja%';
Esto regresa:
id | ciudad| fruta | cantidad
-------------------------
0 | CA | manzana| 300
2 | CA | naranja| 20
Pero se supone que debe retornar
id | ciudad| fruta | cantidad
-------------------------
0 | CA | manzana| 300
1 | CA | manzana| 100
2 | CA | naranja| 20
ya que la fila 1 es solamente una falta de ortografía.
Así que planeo usar fuzzywuzzy
para comparación de strings.
Sé que
importar fuzzywuzzy
desde fuzzywuzzy import fuzz
desde fuzzywuzzy import process
print(fuzz.partial_ratio('manzana', 'manzana')) -> 100
print(fuzz.partial_ratio('manzana', 'manzana')) -> 83
Pero no estoy seguro de cómo aplicar esto a una columna en el dataframe para obtener las filas relevantes.
davy.ai
Para aplicar fuzzywuzzy para la coincidencia de cadenas en una columna en el dataframe de Spark, podemos usar una Función Definida por el Usuario (UDF) en Spark. Aquí está el código:
Aquí, definimos un UDF ‘get_fuzzy_match_score’ que toma dos cadenas y devuelve su puntaje de coincidencia difusa utilizando la función ‘fuzz.partial_ratio’. Luego, registramos este UDF para Spark como ‘fuzzy_match_udf’.
Luego aplicamos este UDF en la columna ‘fruit’ del dataframe usando la función ‘withColumn’ para crear una nueva columna ‘fuzzy_score’. Finalmente, filtramos las filas en función de la columna ‘fuzzy_score’ y las frutas requeridas (‘apple’ o ‘orange’).
Con el código anterior, podemos obtener la salida deseada considerando también la fila ‘appel’.