2017-01-07 4 views
0

Je rencontre des problèmes avec l'exercice de réduction de carte ci-dessous dans Spark avec python. Ma fonction de carte renvoie le RDD suivant.Confus au sujet du comportement de la fonction Réduire dans la carte Réduire

RDD = [(3, ({0: [2], 1: [5], 3: [1]}, l'ensemble ([2]))),
(3, ({0 : [4], 1: [3], 3: [5]}, définir ([1]))),
(1, ({0: [4, 5], 1: [2]}, définir ([3)))]

j'ai écrit une fonction réducteur qui est censé faire des calculs sur tuples avec la même clé (dans l'exemple précédent les deux premières ont key = 3, et la dernière touche est 1)

def Reducer(k, v): 
cluster = k[0] 
rows = [k[1], v[1]] 
g_p = {} 
I_p = set() 
for g, I in rows: 
    g_p = CombineStatistics(g_p, g) 
    I_p = I_p.union(I) 
return (cluster, [g_p, I_p]) 

Le Le problème est que je m'attends à ce que k et v aient toujours la même clé (c.-à-d. k[0]==v[0]). Mais ce n'est pas le cas avec ce code.

Je travaille sur la plateforme Databricks, et honnêtement c'est un cauchemar qui ne peut pas déboguer, parfois même pas "imprimer". C'est vraiment frustrant de travailler dans cet environnement.

Répondre

0

Si vous voulez réduire RDD basé sur la même clé, vous devez utiliser reduceByKey au lieu de reduce transformation. Après avoir remplacé le nom de la fonction, vous devez prendre en compte que les paramètres de la fonction reduceByKey sont des valeurs (k[1] et v[1] dans votre cas) et non des lignes rdd entières.

Les impressions à l'intérieur de la fonction de réduction ne fonctionneront pas en environnement distribué sur les databricks, car cette fonction est évaluée sur les exécuteurs (dans le cloud amazon). Si vous lancez l'étincelle en mode local, toutes les impressions python fonctionneront (mais je ne suis pas sûr si le mode local est disponible sur les databricks).

+0

Donc, malgré le fait que dans la fonction de mappeur je retourne (clé, valeur), seul le paramètre de valeurs sera transmis au réducteur? –

+0

Droite. Et dans le résultat, vous ne retournez que des "valeurs" de RDD. – Mariusz