Счетчик слов
Со времени публикации [7] выполнение подсчета слов стало каноническим примером использования MapReduce, и здесь мы используем эту задачу для иллюстрации мощности SQL/MR. В отличие от примера MapReduce, SQL/MR позволяет пользователю сфокусироваться на интересном с вычислительной точки зрения аспекте этой проблемы – токенизации (tokenizing) входных данных, а для выполнения более прозаических операций группирования и подсчета уникальных слов – использовать доступную инфраструктуру SQL.
Мы написали SQL/MR-функцию общего назначения tokenizer с разделом специальных аргументов, в котором задается вид разделителя. Результирующие данные функции tokenizer – это просто токены. Запрос, содержащий вызов этой функции, группирует ее результат по значениям токенов и вычисляет агрегат COUNT(*). Результирующая смесь SQL и SQL/MR является более сжатым средством подсчета слов, в котором используется существующая инфраструктура обработки запросов к базам данных:
SELECT token, COUNT(*) FROM tokenizer( ON input-table DELIMITER(’ ’) ) GROUP BY token;
Заметим, что это решение не только проще чистой реализации в среде MapReduce, но и позволяет оптимизатору запросов применять имеющиеся методы оптимизации параллельных запросов для вычисления агрегата в распределенной манере.