Considérez cet ensemble de données de notation de film (userId, movieId, rating, timestamp)

1,1,4.0,964982703
1,3,4.0,964981247
1,223,3.0,964980985
1,231,5.0,964981179
1,1226,5.0,964983618
6,95,4.0,845553559
6,100,3.0,845555151
6,102,1.0,845555436
6,104,4.0,845554349
6,105,3.0,845553757
6,110,5.0,845553283
6,112,4.0,845553994
610,152081,4.0,1493846503
610,152372,3.5,1493848841
610,155064,3.5,1493848456
610,156371,5.0,1479542831
610,156726,4.5,1493848444
610,157296,4.0,1493846563
610,158238,5.0,1479545219
610,158721,3.5,1479542491
610,160080,3.0,1493848031
610,160341,2.5,1479545749
610,160527,4.5,1479544998

m = sc.textFile('movies/ratings_s.csv')

Pour un histogramme de notation, je comprends que nous pouvons faire comme suit

scores = m.map(lambda line : line.split(',')[2])
sorted(scores.countByValue().items())

[('1.0', 1), ('2.5', 1), ('3.0', 4), ('3.5', 3), ('4.0', 7), ('4.5', 2), ( '5.0', 5)]

J'ai essayé flatMap juste pour comprendre la différence :

scores = m.flatMap(lambda line : line.split(',')[2])
sorted(scores.countByValue().items())

Le résultat que j'ai eu était

[('.', 23), ('0', 17), ('1', 1), ('2', 1), ('3', 7), ('4', 9), ( '5', 11)]

Pourriez-vous aider à expliquer le comportement de flatMap ici :

  1. Quelle est la logique de flatMap ? Qu'est-ce que ça "aplatit" pour créer un tel résultat ?

  2. Pourquoi ça dépouille "." séparément et ne garder que la partie intégrante ? Nous ne demandons pas de séparer avec "."

  3. Comment récupérer les résultats décimaux avec un score de 0,5 ?

0
Kenny 11 mars 2019 à 04:15

2 réponses

Meilleure réponse

Quelle est la logique de flatMap ? Qu'est-ce que ça "aplatit" pour créer un tel résultat ?

flatMap prend une fonction qui renvoie une "collection" (par exemple une liste). Cela équivaut essentiellement à effectuer un map pour renvoyer la collection qui est plus loin flattened dans ses éléments individuels. Dans votre exemple flatMap, la fonction lambda line : line.split(',')[2] transforme chaque ligne en la 3e chaîne fractionnée, qui (étant considérée comme une collection de caractères) est alors flattened en caractères individuels.

Pourquoi ça dépouille "." séparément et ne garder que la partie intégrante ? Nous ne demandons pas de séparer avec "."

Étant donné que le résultat de flatMap est maintenant une liste de caractères individuels de la 3ème chaîne de division de chaque ligne, countByValue() comptera chacun des chiffres numériques et des points décimaux (en tant que caractères), d'où le rapport résultat.

Comment récupérer les résultats décimaux avec un score de 0,5 ?

Si vous souhaitez utiliser flatMap pour produire le même résultat que votre version map :

m.map(lambda line : line.split(',')[2])

Vous auriez besoin de faire en sorte que la fonction lambda renvoie une collection appropriée des chaînes divisées sélectionnées, comme :

m.flatMap(lambda line : [line.split(',')[2]])
2
Leo C 11 mars 2019 à 05:09

Quelle est la logique de flatMap ? Qu'est-ce que ça "aplatit" pour créer un tel résultat ?

Réponse - line.split(',')[2] renvoie une chaîne. Flatmap aplatit la chaîne (lorsque vous aplatissez une chaîne, vous obtiendrez des caractères car la chaîne est une combinaison de caractères), c'est-à-dire qu'elle crée des caractères à partir de la chaîne, c'est pourquoi vous voyez un caractère dans la sortie.

Pourquoi ça dépouille "." séparément et ne garder que la partie intégrante ? Nous ne demandons pas de se séparer avec "." Réponse - La réponse ci-dessus explique pourquoi ne pas retirer "."

Comment récupérer les résultats décimaux avec un score de 0,5 ? Réponse - encore une fois, la réponse ci-dessus devrait expliquer ce que vous devez faire. Pour traiter les nombres, vous pouvez mapper davantage d'une chaîne à un nombre, puis calculer.

Veuillez accepter la réponse si elle résout.

0
deo 11 mars 2019 à 04:17