SQL/MapReduce
SQL/MR позволяет пользователям писать собственные функции на любом языке программирования и вставлять их вызовы в запросы, в которых во всех остальных отношениях используются традиционные функциональные возможности SQL. SQL/MR-функция определяется в манере, похожей на способ определения функций map и reduce в среде MapReduce, но в случае SQL/MR эти функции выполняются в контексте базы данных.
Во многих отношениях инфраструктура SQL/MR обеспечивает большие возможности, чем традиционные механизмы UDF. Наиболее важно то, что по умолчанию SQL/MR-функции являются параллельными. Как будет показано в разд. 3, модель исполнения SQL/MR-функций (обеспечиваемая их API, на особенности которого повлиял подход MapReduce) является параллельной по своей сути. Запросы выполняются параллельно на крупных кластерах, что обеспечивает линейную масштабируемость системы при возрастании объема данных. Мы продемонстрируем это в разд. 6. SQL/MR-функции также являются динамически полиморфными и самоописываемыми. На практике это означает, что входные схемы SQL/MR-функций определяются неявно во время обработки запросов, а результирующие схемы определяются программным образом самими функциями во время выполнения запроса. Кроме того, в вызов SQL/MR-функции во время выполнения запроса могут быть включены разделы специальных аргументов, обеспечивающих дополнительный динамический контроль над поведением функции и схемой. Эти особенности позволяют реализовывать SQL/MR-функции как истинно библиотечные функции, работающие над произвольными входными данными; конкретное поведение функций определяется во время обработки запросов, в контексте которых они используются. Сложный аналитический код может разрабатываться экспертами и затем использоваться другими людьми в иных потоках работ без каких-либо изменений. Детали синтаксиса SQL/MR и реализация инфраструктуры описываются в разд. 3 и 4.
Мы продемонстрируем некоторые преимущества SQL/MR на примере формирования данных о пользовательских сессиях на основе журнальных файлов Web-сайтов (clickstream sessionization). Большее число примеров можно найти в разд. 5 и 6.