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.