Сегодня закончим с задачами про атлетов и Олимпиады. Что там нас дальше спрашивают?
Для ответа на этот вопрос нужно будет найти общее количество медалей, полученных на всех Олимпиадах, отобрать те Олимпиады, которые произошли в 2000 году или позже и сложить медали. Так, стоп. Кажется, первый шаг мы уже выполняли!
Так что, видимо, можно взять за основу ту же функцию map, что использовалась в прошлый раз.
Однако кое-чего нас тут не устраивает:
1) Нам не нужно знать год, потому что все, что нас интересует про год в данном индексе – это то, что он больше или равен 2000. Соответственно, добавляем условие Year >= 2000 и выкидываем год из результата Map.
2) Т.к. Year мы выкинем, нужно какое-то условие, по которому можно будет сделать агрегацию функцией Reduce (не забывайте, что говоря о map-reduce, мы, вообще-то, мыслим масштабами кластера с несколькими вычисляющими нодами). В таких случаях зачастую добавляют некоторое фиктивное поле, по которому можно будет впоследствии сгруппировать абсолютно все результаты Map в один. Нам подойдет фиктивное поле One = 1.
Итак, внесем поправки в функцию Map:
И тогда функция Reduce становится совсем простой:
Запускаем, и оказывается, что с 2000 года на Олимпиадах было получено 3143 медали.
How many medals have athletes won since the 2000 Games?
Сколько всего медалей было получено начиная с 2000 года?Для ответа на этот вопрос нужно будет найти общее количество медалей, полученных на всех Олимпиадах, отобрать те Олимпиады, которые произошли в 2000 году или позже и сложить медали. Так, стоп. Кажется, первый шаг мы уже выполняли!
Так что, видимо, можно взять за основу ту же функцию map, что использовалась в прошлый раз.
from doc in docs.OlympicAthletes select new { Year = doc.Year, GoldMedals = doc.GoldMedals }
Однако кое-чего нас тут не устраивает:
1) Нам не нужно знать год, потому что все, что нас интересует про год в данном индексе – это то, что он больше или равен 2000. Соответственно, добавляем условие Year >= 2000 и выкидываем год из результата Map.
2) Т.к. Year мы выкинем, нужно какое-то условие, по которому можно будет сделать агрегацию функцией Reduce (не забывайте, что говоря о map-reduce, мы, вообще-то, мыслим масштабами кластера с несколькими вычисляющими нодами). В таких случаях зачастую добавляют некоторое фиктивное поле, по которому можно будет впоследствии сгруппировать абсолютно все результаты Map в один. Нам подойдет фиктивное поле One = 1.
Итак, внесем поправки в функцию Map:
from doc in docs.OlympicAthletes where doc.Year >= 2000 select new { GoldMedals = doc.GoldMedals, One = 1, }
И тогда функция Reduce становится совсем простой:
from result in results group result by result.One into g select new { GoldMedals = g.Sum(x => x.GoldMedals), One = g.Key, }
Запускаем, и оказывается, что с 2000 года на Олимпиадах было получено 3143 медали.
Комментариев нет:
Отправка комментария