es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for 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:

    from pyspark.sql.functions import udf
    from fuzzywuzzy import fuzz
    
    # Definir un UDF para obtener el puntaje de coincidencia difusa
    def get_fuzzy_match_score(str1, str2):
        return fuzz.partial_ratio(str1, str2)
    
    # Registrar el UDF para Spark
    fuzzy_match_udf = udf(get_fuzzy_match_score)
    
    # Aplicar el UDF en la columna 'fruta' y crear una nueva columna 'fuzzy_score'
    df = df.withColumn('fuzzy_score', fuzzy_match_udf(df.fruit, 'apple'))
    
    # Filtrar las filas en función de la columna 'fuzzy_score'
    df = df.filter((df.fuzzy_score > 70) & ((df.fruit == 'apple') | (df.fruit == 'orange')))
    

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

Comments are closed.