суббота, 26 июля 2014 г.

Заканчиваем с атлетами и Олимпиадой. Вопрос 1.

Сегодня закончим  с задачами про атлетов и Олимпиады. Что там нас дальше спрашивают?

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 медали.

Комментариев нет:

Отправить комментарий