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!
davy.ai
El problema aquí está en el ámbito de la variable
lst
. Dentro de la funciónfunc2
,lst
se redefine localmente en lugar de modificar la variable global. Por lo tanto, el métodoappend
se llama en realidad en una nueva lista vacía cada vez que se llama a la función. Es por eso quelst
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ónfunc2
para especificar que la función debe modificar la variable globallst
, en lugar de crear una nueva variable local. Aquí está el código actualizado:En este código actualizado,
lst
se modifica correctamente dentro del bucle, y la salida final es3
, lo que indica que el bucle agregó correctamente cada primer nombre en la lista.