Como você iterate através de valores distintos de uma coluna em um grande Pyspark trama de dados? .distinct (). collect () levanta um grande aviso tarefa

votos
0

Estou tentando percorrer todos os valores distintos na coluna de um grande Pyspark trama de dados. Quando eu tento fazê-lo usando .distinct (). Collect () levanta uma tarefa muito grande, advertindo mesmo se houver apenas dois valores distintos. Aqui está um código de exemplo:

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 produz este aviso que se refere à linha para x em data.select ( um ) distinto () 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.

Como você pode iterar valores distintos em uma coluna de um grande Pyspark trama de dados sem funcionar em problemas de memória?

Publicado 13/01/2020 em 23:54
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Como você já sabe, .collect()não é uma prática recomendada. Porque, é uma ação que transferir todos os dados de executores para o motorista. Então, em uma grande trama de dados com um monte de valores distintos, a coleta não vai funcionar em tudo. Sua raiz problema é que você quer trazer todos os seus dados distribuídos dos executores da JVM para o PVM motorista.

Em um nível elevado, um em torno do trabalho para o seu problema poderia ser a memória de troca com o disco.

Você pode escrever sua trama de dados com valores distintos em um CSV e, em seguida, lê-lo novamente linha por linha com Python ou Pandas *:

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

Com esta solução, você não terá qualquer problema com a memória.

* Há uma série de soluções sobre como ler um grande CSV com o Python ou Pandas.

Respondeu 15/01/2020 em 00:37
fonte usuário

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