¿Cómo iterar a través de los valores distintos de una columna en una gran Pyspark trama de datos? .distinct (). collect () lanza una advertencia gran tarea

votos
0

Estoy tratando de iterar a través de todos los valores distintos en la columna de un gran Pyspark trama de datos. Cuando trato de hacerlo utilizando .distinct (). Collect () plantea una tarea demasiado grande, advirtiendo incluso si sólo hay dos valores distintos. Aquí hay un código de ejemplo:

import pandas as pd
import numpy as np
from pyspark.sql import SparkSession
import pyarrow as pa

spark = SparkSession.builder.appName('Basics').getOrCreate()
spark.conf.set(spark.sql.execution.arrow.enabled, 'true')
length = 200000
table_data = pd.DataFrame({'a': np.random.randint(2,size = length), 'b': np.random.randint(2,size = length),'c': np.random.randint(2,size = length)})

data = spark.createDataFrame(table_data)

for x in data.select(a).distinct().collect():
    data = data.filter(a == '+str(x[0])+')

Este código produce esta advertencia que se refiere a la línea para x en data.select ( a ) distinta () collect ()..:

20/01/13 20:39:01 WARN TaskSetManager: Stage 0 contains a task of very large size (154 KB). The maximum recommended task size is 100 KB.

¿Cómo se puede iterar a través de los valores distintos en una columna de una gran Pyspark trama de datos sin toparse con problemas de memoria?

Publicado el 13/01/2020 a las 23:54
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
0

Como ya saben, .collect()no es una buena práctica. Porque, es una acción que transferir todos los datos de los ejecutores para el conductor. Así, en una gran trama de datos con una gran cantidad de valores distintos, la colecta no funcionará en absoluto. La raíz de su problema es que usted quiere traer a todos sus datos distribuidos desde los ejecutores de JVM en el PVM conductor.

En un nivel alto, alrededor de trabajo para su problema podría ser a la memoria de intercambio con el disco.

Usted puede escribir su trama de datos con valores distintos en un csv y luego volver a leerlo línea por línea con Python o pandas *:

data.select("a").distinct().coalesce(1).write.csv("temp.csv")
# Specifically, it's a directory with one csv.

Con esta solución no tendrá ningún problema con la memoria.

* Hay una gran cantidad de soluciones sobre cómo leer una gran CSV con Python o pandas.

Respondida el 15/01/2020 a las 00:37
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more