Comment les méthodes `map` et` reduce` fonctionnent-elles dans les RDD Spark?
Code suivant est à partir du guide de démarrage rapide de Apache Spark.
Quelqu'un peut-il m'expliquer ce qu'est la "ligne" de la variable et d'où il vient?
textFile.map(line => line.split(" ").size).reduce((a, b) => if (a > b) a else b)
Aussi, comment un obtenir une valeur de passé dans un b?
Lien vers le guide de démarrage rapide http://spark.apache.org/docs/latest/quick-start.html
source d'informationauteur DesirePRG
Vous devez vous connecter pour publier un commentaire.
D'abord, d'après votre lien, le
textfile
est créé commetels que
textfile
est unRDD[String]
c'est à dire à la résilience de l'distribués ensemble de données de typeString
. L'API d'accès est très similaire à celui de régulier Scala collections.Alors maintenant, qu'est-ce
map
faire?Imaginez que vous avez une liste de
String
s et que vous voulez convertir en une liste d'Entiers, représentant la longueur de chaque Chaîne.La
map
méthode s'attend à une fonction. Une fonction, qui va deString => Int
. Avec cette fonction, chaque élément de la liste est transformé. Ainsi, la valeur de intlist estList( 2, 3, 1 )
Ici, nous avons créé une fonction anonyme de
String => Int
. C'estx => x.length
. On peut même écrire la fonction la plus explicite, commeSi vous n'utilisez écrivez ci-dessus explicite, vous pouvez
Donc, ici, il est absolument évident, que stringLength est une fonction de
String
àInt
.Remarque: En général,
map
est un Foncteur. Lorsque vous donnez une fonction à partir d'Un => B,map
de le foncteur (ici la Liste), vous pouvez utiliser cette fonction pour aller deList[A] => List[B]
. Cela s'appelle de levage.Des réponses à vos questions
Comme mentionné ci-dessus,
line
est le paramètre d'entrée de la fonctionline => line.split(" ").size
Plus explicite
(line: String) => line.split(" ").size
Exemple: Si
line
est "hello world", la fonction renvoie 2.reduce
prévoit aussi une fonction de(A, A) => A
oùA
est le type de votreRDD
. Permet d'appeler cette fonctionop
.Ce n'
reduce
. Exemple:Résultat est la somme des éléments de la liste, 10.
Remarque: En général
reduce
calculeExemple complet
D'abord, le texte est un RDD[Chaîne], dit
Map
etreduce
sont des méthodes d'EDR de classe, qui a une interface semblable à la scala collections.Ce que vous passer à des méthodes
map
etreduce
sont en fait fonction anonyme (avec un param dans la carte, et avec deux paramètres à réduire).textFile
appels de fonctions fournies pour chaque élément (ligne de texte dans ce contexte).Vous devriez peut-être lire quelques scala, collection de l'introduction de la première.
Vous pouvez lire plus sur les EDR de classe de l'API ici:
https://spark.apache.org/docs/1.2.1/api/scala/#org.apache.spark.rdd.RDD
ce carte fonction n'est, il prend la liste d'arguments et de l'associer à une certaine fonction. Similaire à la carte de fonction en python, si vous êtes familier.
Aussi, le Fichier est comme une liste de Chaînes de caractères. (pas exactement, mais c'est la façon dont il est itérée)
Prenons l'est de votre fichier.
Maintenant, nous allons voir comment carte fonction des œuvres.
Nous avons besoin de deux choses,
list of values
que nous avons déjà etfunction
à qui nous voulons dresser la carte de ces valeurs. considérons vraiment simple fonction pour la compréhension.cette fonction prend simplement le seul argument de Chaîne et impressions sur la console.
si nous correspondre à cette fonction à votre liste, il va imprimer toutes les lignes
On peut écrire une fonction anonyme comme mentionné ci-dessous, qui fait la même chose.
dans votre cas,
line
est la première ligne du fichier. vous pouvez changer le nom d'argument que vous le souhaitez. par exemple, dans l'exemple ci-dessus, si je changearg
àline
il serait de travailler sans aucun problème