SlideShare a Scribd company logo
Map-Reduce
Алгоритмы
WordCount
• Описание задачи
– Есть коллекция документов
– Каждый документ – это набор термов (слов)
– Необходимо подсчитать кол-во вхождений
каждого терма во всех документах
• Дополнительно
– Функция может быть произвольной
– Например, файл лога содержит время ответа
Необходимо подсчитать среднее время
WordCount: baseline
class Mapper
method Map (docid id, doc d)
for all term t in doc d do
Emit(term t, count 1)
class Reducer
method Reduce (term t, counts [c1, c2,...])
sum = 0
for all count c in [c1, c2,...] do
sum = sum + c
Emit(term t, count sum)
(!) Много лишних счетчиков от Mapper
class Mapper
method Map (docid id, doc d)
for all term t in doc d do
Emit(term t, count 1)
class Combiner
method Combine (term t, [c1, c2,...])
sum = 0
for all count c in [c1, c2,...] do
sum = sum + c
Emit(term t, count sum)
class Reducer
method Reduce (term t, counts [c1, c2,...])
sum = 0
for all count c in [c1, c2,...] do
sum = sum + c
Emit(term t, count sum)
WordCount: “In-mapper combining”, v.1
class Mapper
method Map (docid id, doc d)
H = new AssociativeArray
for all term t in doc d do
H{t} = H{t} + 1
for all term t in H do
Emit(term t, count H{t})
WordCount: “In-mapper combining”, v.2
class Mapper
method Initialize
H = new AssociativeArray
method Map (docid id, doc d)
for all term t in doc d do
H{t} = H{t} + 1
method Close
for all term t in H do
Emit(term t, count H{t})
Среднее значение, v.1
class Mapper
method Map(string t, integer r)
Emit(string t, integer r)
class Reducer
method Reduce(string t, integers [r1, r2, …])
sum = 0
cnt = 0
for all integers r in [r1, r2, …] do
sum = sum + r
cnt = cnt + 1
avg = sum / cnt
Emit(string t, integer avg)
class Mapper
method Map(string t, integer r)
Emit(string t, integer r)
class Combiner
method Combine(string t, integers [r1, r2, …])
sum = cnt = 0
for all integers r in [r1, r2, …] do
sum = sum + r
cnt = cnt + 1
Emit(string t, pair(sum, cnt))
class Reducer
method Reduce(string t, pairs[(s1,c1),(s2,c2) …])
sum = cnt = 0
for all pairs p in [(s1,c1),(s2,c2) …]) do
sum = sum + p.s
cnt = cnt + p.c
avg = sum / cnt
Emit(string t, integer avg)
class Mapper
method Map(string t, integer r)
Emit(string t, pair (r,1))
class Combiner
method Combine(string t pairs[(s1,c1),(s2,c2) …]))
sum = cnt = 0
for all pairs p in [(s1,c1),(s2,c2) …]) do
sum = sum + p.s
cnt = cnt + p.c
Emit(string t, pair(sum, cnt))
class Reducer
method Reduce(string t, pairs[(s1,c1),(s2,c2) …])
sum = cnt = 0
for all pairs p in [(s1,c1),(s2,c2) …]) do
sum = sum + p.s
cnt = cnt + p.c
avg = sum / cnt
Emit(string t, pair (avg, cnt))
class Mapper
method Initialize
S = new AssociativeArray
C = new AssociativeArray
method Map (string t, integer r)
S{t} = S{t} + r
C{t} = C{t} + 1
method Close
for all term t in S do
Emit(term t, pair(S{t}, C{t}))
Distinct Values (Unique Items Counting)
Описание проблемы
– Есть множество записей
– Каждая запись содержит поле F
и производное число категорий
G = {G1, G2, …}
Задача
– Подсчитать общее число
уникальных значений поля F для
каждой категории
Record 1: F=1, G={a, b}
Record 2: F=2, G={a, d, e}
Record 3: F=1, G={b}
Record 4: F=3, G={a, b}
Result:
a -> 3 // F=1, F=2, F=3
b -> 2 // F=1, F=3
d -> 1 // F=2
e -> 1 // F=2
Distinct Values, v.1
• Решение в две фазы
• Первая фаза
– Mapper пишет все уникальные пары [G, F]
– Reducer подсчитывает общее кол-во вхождений такой пары
– Основная цель – гарантировать уникальность значений F для
каждого значения G
• Вторая фаза
– Пары [G, F] группируются по G и затем считается общее кол-
во элементов в каждой группе
Distinct Values, v.1
class Mapper
method Map(null, record [value f, categories [g1, g2,...]])
for all category g in [g1, g2,...]
Emit(record [g, f], count 1)
class Reducer
method Reduce(record [g, f], counts [n1, n2, ...])
Emit(record [g, f], null )
Фаза 1:
Distinct Values, v.1
Фаза 2:
class Mapper
method Map(record [f, g], null)
Emit(value g, count 1)
class Reducer
method Reduce(value g, counts [n1, n2,...])
Emit(value g, sum( [n1, n2,...] ) )
Distinct Values, v.2
Одна фаза MapReduce:
– Mapper
• Пишет значение и категории
– Reducer
• Исключает дубликаты из списка категорий для каждого
значения
• Увеличивает счетчик для каждой категории
• В конце Reducer пишет общее количествово для каждой
категории
class Mapper
method Map(null, record [value f, categories [g1, g2,...] )
for all category g in [g1, g2,...]
Emit(value f, category g)
class Reducer
method Initialize
H = new AssociativeArray : category -> count
method Reduce(value f, categories [g1, g2,...])
[g1', g2',..] = ExcludeDuplicates( [g1, g2,..] )
for all category g in [g1', g2',...]
H{g} = H{g} + 1
method Close
for all category g in H do
Emit(category g, count H{g})
Cross-Correlation
• Описание задачи
– Есть множество кортежей объектов
– Для каждой пары объектов посчитать число кортежей, где они
встречаются вместе
– Если число объектов N, то N*N объектов будет обработано
• Применение
– Анализ текстов
• Кортежи – предложения, объекты – слова
– Маркетинг
• Покупатели, кто покупает одни товары
Cross-Correlation: Pairs
• Каждый Mapper генерит все пары соседних объектов
• Reducer суммирует количество для всех пар
class Mapper
method Map(null, items [i1, i2,...] )
for all item i in [i1, i2,...]
for all item j in [i1, i2,...]
Emit(pair [i j], count 1)
class Reducer
method Reduce(pair [i j], counts [c1, c2,...])
s = sum([c1, c2,...])
Emit(pair[i j], count s)
Cross-Correlation: Stripes
Mapper:
Reducer:
(a, b) → 1
(a, c) → 2
(a, d) → 5 =>
(a, e) → 3
(a, f) → 2
a → { b: 1, d: 5, e: 3 }
a → { b: 1, c: 2, d: 2, f: 2 }
a → { b: 2, c: 2, d: 7, e: 3, f: 2 }
+
a → { b: 1, c:2, d: 5, e: 3, f:2 }
class Mapper
method Map(null, items [i1, i2,...] )
for all item i in [i1, i2,...]
H = new AssociativeArray : item -> counter
for all item j in [i1, i2,...]
H{j} = H{j} + 1
Emit(item i, stripe H)
class Reducer
method Reduce(item i, stripes [H1, H2,...])
H = new AssociativeArray : item -> counter
H = merge-sum( [H1, H2,...] )
for all item j in H.keys()
Emit(pair [i j], H{j})
Cross-Correlation: Stripes
• Плюсы
– Намного меньше операций сортировки и shuffle
– Возможно, более эффективное использование Combiner
• Минусы
– Более сложная реализация
– Более “тяжелые” объекты для передаче данных
– Ограничения на размеры используемой памяти для
ассоциативных массивов
• Pairs vs Stripes
– Обычно, подход со stripes быстрее, чем с pairs
Реляционные паттерны
MapReduce
Выборка (Selection)
class Mapper
method Map(rowkey key, value t)
if t satisfies the predicate
Emit(value t, null)
Проекция (Projection)
class Mapper
method Map(rowkey key, value t)
value g = project(t) // выбрать необходимые поля в g
Emit(tuple g, null)
// используем Reducer для устранения дубликатов
class Reducer
method Reduce(value t, array n) // n - массив из nulls
Emit(value t, null)
Объединение (Union)
// на вход подаются элементы из двух множеств A и B
class Mapper
method Map(rowkey key, value t)
Emit(value t, null)
class Reducer
method Reduce(value t, array n) // n - массив из nulls
Emit(value t, null)
Пересечение (Intersection)
// на вход подаются элементы из двух множеств A и B
class Mapper
method Map(rowkey key, value t)
Emit(value t, null)
class Reducer
method Reduce(value t, array n) // n - массив из nulls
if n.size() = 2
Emit(value t, null)
Разность (Difference)
// на вход подаются элементы из двух множеств A и B
class Mapper
method Map(rowkey key, value t)
Emit(value t, string t.SetName) // t.SetName либо ‘A‘ либо ‘B'
class Reducer
// массив n может быть [‘A'], [‘B'], [‘A' ‘B‘] или [‘B', ‘A']
method Reduce(value t, array n)
if n.size() = 1 and n[1] = ‘A'
Emit(value t, null)
Symmetric Difference
// на вход подаются элементы из двух множеств A и B
class Mapper
method Map(rowkey key, value t)
Emit(value t, string t.SetName) // t.SetName либо ‘A‘ либо ‘B'
class Reducer
// массив n может быть [‘A'], [‘B'], [‘A' ‘B‘] или [‘A', ‘B']
method Reduce(value t, array n)
if n.size() = 1 and (n[1] = ‘A‘ or n[1] = ‘B‘)
Emit(value t, null)
GroupBy и Aggregation
class Mapper
method Map(null, tuple [value GroupBy, value AggregateBy, value ...])
Emit(value GroupBy, value AggregateBy)
class Reducer
method Reduce(value GroupBy, [v1, v2,...])
// aggregate() : sum(), max(),...
Emit(value GroupBy, aggregate( [v1, v2,...] ) )
Repartition Join
Описание задачи
– Объединить два множества A и B по ключу k
id1: a
id2: b
id2: c
id1: 5
id2: 7
id2: 4
id1: (a, 5)
id2: (b, 7)
id2: (b, 4)
id2: (c, 7)
id2: (c, 4)
join =
Repartition Join
class Mapper
method Map(null, tuple [join_key k, value v1, value v2,...])
Emit(join_key k, tagged_tuple [set_name tag, values [v1, v2, ...] ] )
class Reducer
method Reduce(join_key k, tagged_tuples [t1, t2,...])
H = new AssociativeArray : set_name -> values
for all tagged_tuple t in [t1, t2,...] // separate values into 2 arrays
H{t.tag}.add(t.values)
for all values a in H{‘A'} // produce a cross-join of the two arrays
for all values b in H{‘B'}
Emit(null, [k a b] )
Replicated Join
• Одно множество большое, другое – маленькое
• Храним маленькое в хеш-таблице с ключом k
• Mapper объединяет элементы с данными из этой
хеш-таблице
Replicated Join
class Mapper
method Initialize
H = new AssociativeArray : join_key -> tuple from A
A = load()
for all [ join_key k, tuple [a1, a2,...] ] in A
H{k} = H{k}.append( [a1, a2,...] )
method Map(join_key k, tuple B)
for all tuple a in H{k}
Emit(null, tuple [k a B] )
TF-IDF на MapReduce
TF-IDF
Term Frequency – Inverse Document Frequency
– Используется при работе с текстом
– В Information Retrieval
TF
Term Frequency — отношение числа
вхождения слова к общему количеству слов
документа
𝑛𝑖 - число вхождений слова в документ
𝑡𝑓 𝑡, 𝑑 =
𝑛𝑖
𝑛 𝑘𝑘
IDF
Inverse Document Frequency — инверсия частоты,
с которой слово встречается в документах
коллекции
𝑖𝑑𝑓 𝑡, 𝐷 = log
𝐷
(𝑑𝑖 ⊃ 𝑡)
Где:
|D| — количество документов в корпусе
(𝑑𝑖 ⊃ 𝑡) — кол-во документов, содержащих 𝑡
TF-IDF
𝑡𝑓_𝑖𝑑𝑓 𝑡, 𝑑, 𝐷 = 𝑡𝑓(𝑡, 𝑑) × 𝑖𝑑𝑓(𝑡, 𝐷)
TF-IDF
Что нужно будет вычислить:
– Сколько раз слово T встречается в данном
документе (tf)
– Сколько документов, в котором встречается
данное слово T (n)
– Общее число документов (N)
TF-IDF
• Job 1: Частота слова в документе
• Mapper
– Input: (docname, contents)
– Output: ((word, docname), 1)
• Reducer
– Суммирует число слов в документе
– Outputs: ((word, docname), tf)
• Combiner такой же как и Reducer
TF-IDF
• Job 2: Кол-во документов для слова
• Mapper
– Input: ((word, docname), tf)
– Output: (word, (docname, tf, 1))
• Reducer
– Суммирует единицы чтобы посчитать n
– Output: ((word, docname), (tf,n))
TF-IDF
• Job 3: Расчет TF-IDF
• Mapper
– Input: ((word, docname), (tf,n))
– Output: ((word, docname), (TF*IDF))
• Reducer
– Не требуется

More Related Content

PPTX
PostgreSQL Database Slides
PDF
Лекция 5. MapReduce в Hadoop (алгоритмы)
ODP
Introduction to triggers
PDF
Database development coding standards
PDF
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
PPTX
PostgreSQL- An Introduction
PDF
Introduction to Mongodb execution plan and optimizer
PPTX
Sql subquery
PostgreSQL Database Slides
Лекция 5. MapReduce в Hadoop (алгоритмы)
Introduction to triggers
Database development coding standards
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
PostgreSQL- An Introduction
Introduction to Mongodb execution plan and optimizer
Sql subquery

What's hot (20)

PDF
Implementation of EAV pattern for ActiveRecord models
PDF
Node.js Express Tutorial | Node.js Tutorial For Beginners | Node.js + Expres...
PDF
Лекция 6. MapReduce в Hadoop (графы)
PDF
Clean code
PDF
Monadic Java
PPTX
Spring Boot and REST API
PDF
MongoDB Aggregation Framework
PDF
Swagger UI
PPTX
Sql joins
PDF
REST APIs with Spring
PPTX
Proposal for nested document support in Lucene
PPT
PL/SQL Introduction and Concepts
PDF
Deciphering Explain Output
PPT
Codeigniter
PPTX
MongoDB Aggregation
PDF
Sql integrity constraints
PPTX
Devoxx 2012 hibernate envers
PDF
RxJS Operators - Real World Use Cases (FULL VERSION)
PPTX
JDBC - JPA - Spring Data
Implementation of EAV pattern for ActiveRecord models
Node.js Express Tutorial | Node.js Tutorial For Beginners | Node.js + Expres...
Лекция 6. MapReduce в Hadoop (графы)
Clean code
Monadic Java
Spring Boot and REST API
MongoDB Aggregation Framework
Swagger UI
Sql joins
REST APIs with Spring
Proposal for nested document support in Lucene
PL/SQL Introduction and Concepts
Deciphering Explain Output
Codeigniter
MongoDB Aggregation
Sql integrity constraints
Devoxx 2012 hibernate envers
RxJS Operators - Real World Use Cases (FULL VERSION)
JDBC - JPA - Spring Data
Ad

Similar to 07 - Hadoop. Решение задач с помощью MapReduce (16)

PPTX
алексей романенко
PDF
О.В. Сухорослов "Разбор ДЗ №3,4"
PPTX
Hadoops MapReduce framework explanations
PDF
AlgoCollections (RUS)
PPT
Java. Интерфейс Map - ассоциативные массивы.
PDF
Scala
PDF
Введение в программирование (1 часть)
PDF
06 - Hadoop. Java API и Hadoop Streaming
PDF
Apache Spark — Егор Пахомов
PDF
Romanenko
PDF
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
PDF
Kuznetsov mapreduce urfu_2013
PPTX
Collections
PDF
Базы данных в 2020
PPTX
Зачем нужна Scala?
PPTX
Expert Fridays - Сергей Укустов: "CRDT"
алексей романенко
О.В. Сухорослов "Разбор ДЗ №3,4"
Hadoops MapReduce framework explanations
AlgoCollections (RUS)
Java. Интерфейс Map - ассоциативные массивы.
Scala
Введение в программирование (1 часть)
06 - Hadoop. Java API и Hadoop Streaming
Apache Spark — Егор Пахомов
Romanenko
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Kuznetsov mapreduce urfu_2013
Collections
Базы данных в 2020
Зачем нужна Scala?
Expert Fridays - Сергей Укустов: "CRDT"
Ad

More from Roman Brovko (20)

PDF
Individual task Networking
PPTX
Networking essentials lect3
PPTX
Gl embedded starterkit_ethernet
PPTX
Networking essentials lect2
PPTX
Networking essentials lect1
PPTX
Bare metal training_07_spi_flash
PPTX
Bare metal training_06_I2C
PPTX
Glesk worshop
PPTX
Bare metal training_05_uart
PPTX
Bare metal training_04_adc_temp_sensor
PPTX
Bare metal training_03_timers_pwm
PPTX
Bare metal training_02_le_ds_and_buttons
PPTX
Bare metal training_01_hello_world
PPTX
Bare metal training_00_prerequisites
PPTX
C language lect_23_advanced
PPTX
C language lect_22_advanced
PPTX
C language lect_21_advanced
PPTX
подготовка рабочего окружения
PPTX
C language lect_20_advanced
PPTX
C language lect_19_basics
Individual task Networking
Networking essentials lect3
Gl embedded starterkit_ethernet
Networking essentials lect2
Networking essentials lect1
Bare metal training_07_spi_flash
Bare metal training_06_I2C
Glesk worshop
Bare metal training_05_uart
Bare metal training_04_adc_temp_sensor
Bare metal training_03_timers_pwm
Bare metal training_02_le_ds_and_buttons
Bare metal training_01_hello_world
Bare metal training_00_prerequisites
C language lect_23_advanced
C language lect_22_advanced
C language lect_21_advanced
подготовка рабочего окружения
C language lect_20_advanced
C language lect_19_basics

07 - Hadoop. Решение задач с помощью MapReduce

  • 2. WordCount • Описание задачи – Есть коллекция документов – Каждый документ – это набор термов (слов) – Необходимо подсчитать кол-во вхождений каждого терма во всех документах • Дополнительно – Функция может быть произвольной – Например, файл лога содержит время ответа Необходимо подсчитать среднее время
  • 3. WordCount: baseline class Mapper method Map (docid id, doc d) for all term t in doc d do Emit(term t, count 1) class Reducer method Reduce (term t, counts [c1, c2,...]) sum = 0 for all count c in [c1, c2,...] do sum = sum + c Emit(term t, count sum) (!) Много лишних счетчиков от Mapper
  • 4. class Mapper method Map (docid id, doc d) for all term t in doc d do Emit(term t, count 1) class Combiner method Combine (term t, [c1, c2,...]) sum = 0 for all count c in [c1, c2,...] do sum = sum + c Emit(term t, count sum) class Reducer method Reduce (term t, counts [c1, c2,...]) sum = 0 for all count c in [c1, c2,...] do sum = sum + c Emit(term t, count sum)
  • 5. WordCount: “In-mapper combining”, v.1 class Mapper method Map (docid id, doc d) H = new AssociativeArray for all term t in doc d do H{t} = H{t} + 1 for all term t in H do Emit(term t, count H{t})
  • 6. WordCount: “In-mapper combining”, v.2 class Mapper method Initialize H = new AssociativeArray method Map (docid id, doc d) for all term t in doc d do H{t} = H{t} + 1 method Close for all term t in H do Emit(term t, count H{t})
  • 7. Среднее значение, v.1 class Mapper method Map(string t, integer r) Emit(string t, integer r) class Reducer method Reduce(string t, integers [r1, r2, …]) sum = 0 cnt = 0 for all integers r in [r1, r2, …] do sum = sum + r cnt = cnt + 1 avg = sum / cnt Emit(string t, integer avg)
  • 8. class Mapper method Map(string t, integer r) Emit(string t, integer r) class Combiner method Combine(string t, integers [r1, r2, …]) sum = cnt = 0 for all integers r in [r1, r2, …] do sum = sum + r cnt = cnt + 1 Emit(string t, pair(sum, cnt)) class Reducer method Reduce(string t, pairs[(s1,c1),(s2,c2) …]) sum = cnt = 0 for all pairs p in [(s1,c1),(s2,c2) …]) do sum = sum + p.s cnt = cnt + p.c avg = sum / cnt Emit(string t, integer avg)
  • 9. class Mapper method Map(string t, integer r) Emit(string t, pair (r,1)) class Combiner method Combine(string t pairs[(s1,c1),(s2,c2) …])) sum = cnt = 0 for all pairs p in [(s1,c1),(s2,c2) …]) do sum = sum + p.s cnt = cnt + p.c Emit(string t, pair(sum, cnt)) class Reducer method Reduce(string t, pairs[(s1,c1),(s2,c2) …]) sum = cnt = 0 for all pairs p in [(s1,c1),(s2,c2) …]) do sum = sum + p.s cnt = cnt + p.c avg = sum / cnt Emit(string t, pair (avg, cnt))
  • 10. class Mapper method Initialize S = new AssociativeArray C = new AssociativeArray method Map (string t, integer r) S{t} = S{t} + r C{t} = C{t} + 1 method Close for all term t in S do Emit(term t, pair(S{t}, C{t}))
  • 11. Distinct Values (Unique Items Counting) Описание проблемы – Есть множество записей – Каждая запись содержит поле F и производное число категорий G = {G1, G2, …} Задача – Подсчитать общее число уникальных значений поля F для каждой категории Record 1: F=1, G={a, b} Record 2: F=2, G={a, d, e} Record 3: F=1, G={b} Record 4: F=3, G={a, b} Result: a -> 3 // F=1, F=2, F=3 b -> 2 // F=1, F=3 d -> 1 // F=2 e -> 1 // F=2
  • 12. Distinct Values, v.1 • Решение в две фазы • Первая фаза – Mapper пишет все уникальные пары [G, F] – Reducer подсчитывает общее кол-во вхождений такой пары – Основная цель – гарантировать уникальность значений F для каждого значения G • Вторая фаза – Пары [G, F] группируются по G и затем считается общее кол- во элементов в каждой группе
  • 13. Distinct Values, v.1 class Mapper method Map(null, record [value f, categories [g1, g2,...]]) for all category g in [g1, g2,...] Emit(record [g, f], count 1) class Reducer method Reduce(record [g, f], counts [n1, n2, ...]) Emit(record [g, f], null ) Фаза 1:
  • 14. Distinct Values, v.1 Фаза 2: class Mapper method Map(record [f, g], null) Emit(value g, count 1) class Reducer method Reduce(value g, counts [n1, n2,...]) Emit(value g, sum( [n1, n2,...] ) )
  • 15. Distinct Values, v.2 Одна фаза MapReduce: – Mapper • Пишет значение и категории – Reducer • Исключает дубликаты из списка категорий для каждого значения • Увеличивает счетчик для каждой категории • В конце Reducer пишет общее количествово для каждой категории
  • 16. class Mapper method Map(null, record [value f, categories [g1, g2,...] ) for all category g in [g1, g2,...] Emit(value f, category g) class Reducer method Initialize H = new AssociativeArray : category -> count method Reduce(value f, categories [g1, g2,...]) [g1', g2',..] = ExcludeDuplicates( [g1, g2,..] ) for all category g in [g1', g2',...] H{g} = H{g} + 1 method Close for all category g in H do Emit(category g, count H{g})
  • 17. Cross-Correlation • Описание задачи – Есть множество кортежей объектов – Для каждой пары объектов посчитать число кортежей, где они встречаются вместе – Если число объектов N, то N*N объектов будет обработано • Применение – Анализ текстов • Кортежи – предложения, объекты – слова – Маркетинг • Покупатели, кто покупает одни товары
  • 18. Cross-Correlation: Pairs • Каждый Mapper генерит все пары соседних объектов • Reducer суммирует количество для всех пар class Mapper method Map(null, items [i1, i2,...] ) for all item i in [i1, i2,...] for all item j in [i1, i2,...] Emit(pair [i j], count 1) class Reducer method Reduce(pair [i j], counts [c1, c2,...]) s = sum([c1, c2,...]) Emit(pair[i j], count s)
  • 19. Cross-Correlation: Stripes Mapper: Reducer: (a, b) → 1 (a, c) → 2 (a, d) → 5 => (a, e) → 3 (a, f) → 2 a → { b: 1, d: 5, e: 3 } a → { b: 1, c: 2, d: 2, f: 2 } a → { b: 2, c: 2, d: 7, e: 3, f: 2 } + a → { b: 1, c:2, d: 5, e: 3, f:2 }
  • 20. class Mapper method Map(null, items [i1, i2,...] ) for all item i in [i1, i2,...] H = new AssociativeArray : item -> counter for all item j in [i1, i2,...] H{j} = H{j} + 1 Emit(item i, stripe H) class Reducer method Reduce(item i, stripes [H1, H2,...]) H = new AssociativeArray : item -> counter H = merge-sum( [H1, H2,...] ) for all item j in H.keys() Emit(pair [i j], H{j})
  • 21. Cross-Correlation: Stripes • Плюсы – Намного меньше операций сортировки и shuffle – Возможно, более эффективное использование Combiner • Минусы – Более сложная реализация – Более “тяжелые” объекты для передаче данных – Ограничения на размеры используемой памяти для ассоциативных массивов • Pairs vs Stripes – Обычно, подход со stripes быстрее, чем с pairs
  • 23. Выборка (Selection) class Mapper method Map(rowkey key, value t) if t satisfies the predicate Emit(value t, null)
  • 24. Проекция (Projection) class Mapper method Map(rowkey key, value t) value g = project(t) // выбрать необходимые поля в g Emit(tuple g, null) // используем Reducer для устранения дубликатов class Reducer method Reduce(value t, array n) // n - массив из nulls Emit(value t, null)
  • 25. Объединение (Union) // на вход подаются элементы из двух множеств A и B class Mapper method Map(rowkey key, value t) Emit(value t, null) class Reducer method Reduce(value t, array n) // n - массив из nulls Emit(value t, null)
  • 26. Пересечение (Intersection) // на вход подаются элементы из двух множеств A и B class Mapper method Map(rowkey key, value t) Emit(value t, null) class Reducer method Reduce(value t, array n) // n - массив из nulls if n.size() = 2 Emit(value t, null)
  • 27. Разность (Difference) // на вход подаются элементы из двух множеств A и B class Mapper method Map(rowkey key, value t) Emit(value t, string t.SetName) // t.SetName либо ‘A‘ либо ‘B' class Reducer // массив n может быть [‘A'], [‘B'], [‘A' ‘B‘] или [‘B', ‘A'] method Reduce(value t, array n) if n.size() = 1 and n[1] = ‘A' Emit(value t, null)
  • 28. Symmetric Difference // на вход подаются элементы из двух множеств A и B class Mapper method Map(rowkey key, value t) Emit(value t, string t.SetName) // t.SetName либо ‘A‘ либо ‘B' class Reducer // массив n может быть [‘A'], [‘B'], [‘A' ‘B‘] или [‘A', ‘B'] method Reduce(value t, array n) if n.size() = 1 and (n[1] = ‘A‘ or n[1] = ‘B‘) Emit(value t, null)
  • 29. GroupBy и Aggregation class Mapper method Map(null, tuple [value GroupBy, value AggregateBy, value ...]) Emit(value GroupBy, value AggregateBy) class Reducer method Reduce(value GroupBy, [v1, v2,...]) // aggregate() : sum(), max(),... Emit(value GroupBy, aggregate( [v1, v2,...] ) )
  • 30. Repartition Join Описание задачи – Объединить два множества A и B по ключу k id1: a id2: b id2: c id1: 5 id2: 7 id2: 4 id1: (a, 5) id2: (b, 7) id2: (b, 4) id2: (c, 7) id2: (c, 4) join =
  • 31. Repartition Join class Mapper method Map(null, tuple [join_key k, value v1, value v2,...]) Emit(join_key k, tagged_tuple [set_name tag, values [v1, v2, ...] ] ) class Reducer method Reduce(join_key k, tagged_tuples [t1, t2,...]) H = new AssociativeArray : set_name -> values for all tagged_tuple t in [t1, t2,...] // separate values into 2 arrays H{t.tag}.add(t.values) for all values a in H{‘A'} // produce a cross-join of the two arrays for all values b in H{‘B'} Emit(null, [k a b] )
  • 32. Replicated Join • Одно множество большое, другое – маленькое • Храним маленькое в хеш-таблице с ключом k • Mapper объединяет элементы с данными из этой хеш-таблице
  • 33. Replicated Join class Mapper method Initialize H = new AssociativeArray : join_key -> tuple from A A = load() for all [ join_key k, tuple [a1, a2,...] ] in A H{k} = H{k}.append( [a1, a2,...] ) method Map(join_key k, tuple B) for all tuple a in H{k} Emit(null, tuple [k a B] )
  • 35. TF-IDF Term Frequency – Inverse Document Frequency – Используется при работе с текстом – В Information Retrieval
  • 36. TF Term Frequency — отношение числа вхождения слова к общему количеству слов документа 𝑛𝑖 - число вхождений слова в документ 𝑡𝑓 𝑡, 𝑑 = 𝑛𝑖 𝑛 𝑘𝑘
  • 37. IDF Inverse Document Frequency — инверсия частоты, с которой слово встречается в документах коллекции 𝑖𝑑𝑓 𝑡, 𝐷 = log 𝐷 (𝑑𝑖 ⊃ 𝑡) Где: |D| — количество документов в корпусе (𝑑𝑖 ⊃ 𝑡) — кол-во документов, содержащих 𝑡
  • 38. TF-IDF 𝑡𝑓_𝑖𝑑𝑓 𝑡, 𝑑, 𝐷 = 𝑡𝑓(𝑡, 𝑑) × 𝑖𝑑𝑓(𝑡, 𝐷)
  • 39. TF-IDF Что нужно будет вычислить: – Сколько раз слово T встречается в данном документе (tf) – Сколько документов, в котором встречается данное слово T (n) – Общее число документов (N)
  • 40. TF-IDF • Job 1: Частота слова в документе • Mapper – Input: (docname, contents) – Output: ((word, docname), 1) • Reducer – Суммирует число слов в документе – Outputs: ((word, docname), tf) • Combiner такой же как и Reducer
  • 41. TF-IDF • Job 2: Кол-во документов для слова • Mapper – Input: ((word, docname), tf) – Output: (word, (docname, tf, 1)) • Reducer – Суммирует единицы чтобы посчитать n – Output: ((word, docname), (tf,n))
  • 42. TF-IDF • Job 3: Расчет TF-IDF • Mapper – Input: ((word, docname), (tf,n)) – Output: ((word, docname), (TF*IDF)) • Reducer – Не требуется