Ответ 1
В основном есть два способа добавления пользовательских карт/редукторов к запросам на улей.
- с помощью
transform
SELECT TRANSFORM (stuff1, stuff2) FROM table1 ИСПОЛЬЗОВАНИЕ 'script' AS thing1, thing2
где stuff1, stuff2 - поля в таблице1, а script - любой исполняемый файл, который принимает формат, описанный ниже. thing1, thing2 - выходы из script
- с использованием карты и сокращения
FROM ( FROM table MAP table.f1 table.f2 USING 'map_script' AS mp1, mp2 CLUSTER BY mp1) map_output INSERT OVERWRITE TABLE someothertable REDUCE map_output.mp1, map_output.mp2 USING 'reduce_script' AS reducef1, reducef2;
Это немного сложнее, но дает больше контроля. Для этого есть две части. В первой части mapper script будет получать данные из table
и сопоставить их с полями mp1 и mp2. они затем передаются на reduce_script
, этот script будет получать отсортированный вывод на ключ, который мы указали в CLUSTER BY mp1
. заметьте, более одного ключа будет обрабатываться одним редуктором. Результат уменьшения script будет отображаться в таблице someothertable
Теперь все эти скрипты следуют простой схеме. они будут читать строки за строкой из stdin. Поля будут \t
разделены, и они будут записывать обратно в stdout таким же образом (поля, разделенные символом '\ t')
Посмотрите этот блог, есть несколько приятных примеров.
http://dev.bizo.com/2009/07/custom-map-scripts-and-hive.html