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 à 21:54
source utilisateur
Dans d'autres langues...                            


2 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éé 14/01/2020 à 22:37
source utilisateur

voix
0

L'avertissement:

20/01/13 20:39:01 WARN TaskSetManager: Etape 0 contient une tâche de très grande taille (154 KB). La taille de la tâche maximale recommandée est de 100 Ko.

Se réfère à la taille de la tâche qui send Spark à exécuteurs. Par conséquent, je pense que cela n'a rien à voir avec la mémoire, mais avec la taille de la tâche et les données que vous envoyez avec elle. Dans votre cas, les données sont produites par:

pd.DataFrame({'a': np.random.randint(2,size = length), 'b': np.random.randint(2,size = length),'c': np.random.randint(2,size = length)})

Maintenant , le problème est que la taille de cette trame de données dépasse la taille de la taille de la tâche qui est permis 100KB. Vous pouvez récupérer la taille du table_dataavec:

table_data.info(memory_usage='deep')

Cela devrait vous donner environ 4.6MB = 4710.4KB. Dans votre cas , la taille de la tâche est 154KB à partir de laquelle nous pouvons conclure que l'ensemble de données a 4710/154 ~ 30 partitions (s'il vous plaît confirmer si possible data.rdd.getNumPartitions()).

La solution pourrait être repartitionner à un plus grand nombre afin d'avoir une taille plus petite tâche <= 100KB ie: 4710/50 = 94.2KB. devrait ressembler suivant votre requête finale:

data.repartition(50).select("a").distinct().collect()

Ce qui est arrivé maintenant que nous avons divisé l'ensemble de données initial à 50 partitions dont les résultats de la taille des données beaucoup plus petite pour chaque tâche (~ 94KB comme nous l'avons vu plus haut).

Créé 29/01/2020 à 17:10
source utilisateur

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