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.

Error: La operación de agregar una lista en Pyspark dentro de un bucle foreach en un dataframe produce una lista vacía fuera del bucle.

Estoy enfrentando el siguiente problema:

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('SparkByExamples.com').getOrCreate()

data = [('James','Smith','M',30),('Anna','Rose','F',41),('Robert','Williams','M',62), ]
columns = ["firstname","lastname","gender","salary"]
df = spark.createDataFrame(data=data, schema = columns)
lst = []

def func2(x):
    lst = lst.append(x.firstname)

df.foreach(func2)

h1>df.foreach(lambda x: func2(x))

print(len(lst))

La variable lst al final del loop siempre está vacía. ¿Cuál es la razón de esto? ¿Hay alguna solución?

¡Gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema aquí está en el ámbito de la variable lst. Dentro de la función func2, lst se redefine localmente en lugar de modificar la variable global. Por lo tanto, el método append se llama en realidad en una nueva lista vacía cada vez que se llama a la función. Es por eso que lst permanece vacía después de que se completa el bucle.

    Para solucionar este problema, puede agregar la palabra clave global dentro de la función func2 para especificar que la función debe modificar la variable global lst, en lugar de crear una nueva variable local. Aquí está el código actualizado:

    from pyspark.sql import SparkSession
    
    spark = SparkSession.builder.appName('SparkByExamples.com').getOrCreate()
    
    data = [('James','Smith','M',30),('Anna','Rose','F',41),('Robert','Williams','M',62)]
    columns = ["firstname","lastname","gender","salary"]
    df = spark.createDataFrame(data=data, schema = columns)
    lst = []
    
    def func2(x):
        global lst
        lst.append(x.firstname)
    
    df.foreach(func2)
    
    print(len(lst)) # output: 3
    

    En este código actualizado, lst se modifica correctamente dentro del bucle, y la salida final es 3, lo que indica que el bucle agregó correctamente cada primer nombre en la lista.

Comments are closed.