Comment itérer-vous à travers des valeurs distinctes d'une colonne dans un grand Pyspark dataframe? .distinct (). Collect () soulève un grand avertissement de tâche

voix
0

Je suis en train de itérer à travers toutes les valeurs distinctes dans la colonne d'un grand Pyspark dataframe. Lorsque je tente de le faire en utilisant .distinct (). Collect () soulève une « tâche trop grande » avertissement même s'il n'y a que deux valeurs distinctes. Voici quelques exemples de code:

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])+')

Ce code produit cet avertissement qui fait référence à la ligne pour x dans data.select ( a ) distincte () 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.

Comment pouvez-vous itérer valeurs distinctes dans une colonne d'une grande Pyspark dataframe sans courir dans des problèmes de mémoire?

Créé 13/01/2020 à 23:54
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Comme vous le savez, .collect()n'est pas une meilleure pratique. Parce que, c'est une action qui transfère toutes les données de exécuteurs au conducteur. Ainsi, dans un grand dataframe avec beaucoup de valeurs distinctes, la ne fonctionnera pas du tout Collect. La racine de votre problème est que vous voulez apporter toutes vos données distribuées des exécuteurs JVM dans le PVM du pilote.

Dans un haut niveau, un travail autour de votre problème pourrait être de mémoire d'échange avec le disque.

Vous pouvez écrire votre dataframe avec des valeurs distinctes dans un csv puis le lire à nouveau la ligne par ligne avec Python ou Pandas *:

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

Avec cette solution, vous n'aurez aucun problème avec la mémoire.

* Il y a beaucoup de solutions sur la façon de lire un grand CSV avec Python ou Pandas.

Créé 15/01/2020 à 00:37
source utilisateur

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