2 votes

Sélection de colonnes aléatoires pour chaque groupe de pyspark RDD/dataframe

Mon cadre de données a 10.000 colonnes, je dois appliquer une certaine logique sur chaque groupe (la clé est la région et le département). Chaque groupe utilisera au maximum 30 colonnes parmi les 10 000 colonnes, la liste des 30 colonnes provient de la colonne "colList" du deuxième ensemble de données. Chaque groupe aura 2-3 millions de lignes. Mon approche est de faire un groupe par clé et d'appeler la fonction comme ci-dessous. Mais cela échoue - 1. le mélange et 2. le groupe de données est plus de 2G (peut être résolu par la re-partition mais c'est coûteux), 3. très lent.

def testfunc(iter):
   <<got some complex business logic which cant be done in spark API>>

resRDD = df.rdd.groupBy(region, dept).map(lambda x: testfunc(x))

Entrée :

region dept week val0 val1  val2  val3 ... val10000   
 US    CS   1     1    2    1     1   ...  2 
 US    CS   2     1.5  2    3     1   ...  2
 US    CS   3     1    2    2     2.1      2
 US    ELE  1     1.1  2    2     2.1      2
 US    ELE  2     2.1  2    2     2.1      2
 US    ELE  3     1    2    1     2   .... 2
 UE    CS   1     2    2    1     2   .... 2

Colonnes à choisir pour chaque groupe : (ensemble de données 2)

region dept colList   
 US    CS   val0,val10,val100,val2000 
 US    ELE  val2,val5,val800,val900
 UE    CS   val21,val54,val806,val9000

Ma deuxième solution est de créer un nouvel ensemble de données à partir des données d'entrée avec seulement 30 colonnes et de renommer les colonnes de col1 à col30. Ensuite, utilisez une liste de mappage pour chaque colonne et groupe. Ensuite, je peux appliquer groupbyKey (en supposant), ce qui sera plus fin que l'entrée originale de 10K colonnes.

region dept week col0 col1  col2  col3 ... col30   
 US    CS   1     1    2    1     1   ...  2 
 US    CS   2     1.5  2    3     1   ...  2
 US    CS   3     1    2    2     2.1      2
 US    ELE  1     1.1  2    2     2.1      2
 US    ELE  2     2.1  2    2     2.1      2
 US    ELE  3     1    2    1     2   .... 2
 UE    CS   1     2    2    1     2   .... 2

Quelqu'un peut-il m'aider à convertir une entrée de 10K en 30 colonnes ? Ou toute autre alternative pour éviter le group by.

0voto

Assaf Mendelson Points 26

Vous pouvez utiliser la fonction create_map pour convertir les 10 000 colonnes en carte par ligne. Ensuite, utilisez un UDF qui prend la carte, la région et le département et divise la carte en 30 colonnes, en veillant à ce que les 30 colonnes aient toujours le même nom. Enfin, vous pouvez envelopper votre fonction complexe pour recevoir la carte au lieu des 10 000 colonnes d'origine. J'espère que cela permettra de réduire suffisamment la taille du fichier pour qu'il fonctionne correctement.

Si ce n'est pas le cas, vous pouvez obtenir une distinction entre la région et le département et, en supposant qu'il y en ait suffisamment, vous pouvez boucler sur l'un et grouper l'autre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X