Upload
anatoliy-nikulin
View
198
Download
2
Embed Size (px)
DESCRIPTION
Сравниваем Hive и Pig. Две ETL системы для работы с большими данными/
Citation preview
На что мне столько разных штук?Hive vs Pig
Лучше день потерять, но потом за пять минут долететь (с)
Анатолий Никулин
Hive
● SQL-like язык HQL
● Интерактивная консоль
● Встроенные функции агрегации
● Поддержка UDF (Java, Python)
● Данные - как таблица
Hive - плюсы
● Старый добрый SQL. Хорош для описания выборок, да и просто, все его знают.
● Формирование MR Job под капотом. Уходит много оверхеда, связанного с обвязкой вокруг MR. Описание моделей данных, входных и выходных форматов, цепочек MR задач.
● Интерактивность. Хорош для анализа данных в разных срезах.
● Быстрота разработки. Отсутствие зависимостей, сборки, unit-тестов
Hive - минусы
● Не всё можно уложить в HQL ● Трудно работать с датами● Это хорошо “ложится” в голову, при
простых выборках. Но не легко в случаях
сложных выборок.
Hive - простой пример
Hive - сложный пример
Ну как вам? (как то грешновато)
● Не хватает какой-то упорядоченности
● Разложить бы всё по полочкам...
Pig
● Pig - процедурный подход
● Интерактивная консоль
● Встроенные функции агрегации
● Поддержка UDF (Java, Jython)
● Данные - в виде разных структур.
Pig - плюсы
● Процедурный подход. Упорядоченность! Язык позволяет разбивать логику на блоки, каждый шаг можно развернуто описывать комментариями.
● Формирование MR Job под капотом. Уходит много оверхеда, связанного с обвязкой вокруг MR. Описание моделей данных, входных и выходных форматов, цепочек MR задач.
● Интерактивность. Хорош для анализа данных в разных срезах.
● Быстрота разработки. Отсутствие зависимостей, сборки, unit-тестов
Pig - минусы
● Не всё можно уложить в язык Pig Latin
● Pig Latin вместе со структурами данных,
более сложен, в отличии от HiveQL
● Для UDF используется Jython. Это может ограничить в использовании некоторых библиотек.
Pig - cтруктуры данных
● Tuple - упорядоченный набор полей. Структура, к полям которой можно обращаться по индексу и/или имени
● Bag - коллекция (множество) Tuple.
Pig - функции
● LOAD● STORE● GENERATE● JOIN● GROUP● FILTER● UNION● DISTINCT● ORDER
fs -rm -f -r -skipTrash /analytical_engine/pig/out
raw_data = LOAD '/analytical_engine/data/example/' USING PigStorage('\t') AS
(time, bid_id, user_id, dsp_id, bid:int);
raw_data -> tuple с именованными полями------------------------------------------------------------------------------------------- time bid_id user_id dsp_id bid------------------------------------------------------------------------------------------- (2014.02.14 14:08:27.711, 56949, User-id-1, DSP-2, 12)
(2014.02.14 14:08:28.712, 61336, 45221696259999, DSP-1, 56)
(2014.02.14 14:08:29.713, 74685, 45221699381039, DSP-2, 89)
(2014.02.14 14:08:30.714, 56949, 45221695781716, DSP-1, 21)
(2014.02.14 14:08:25.715, 27617, 45221682863705, DSP-3, 22)
Pig - загрузка данных (LOAD)
--Нормализуем данные
norm_data = FOREACH raw_data GENERATE SUBSTRING(time, 0,10) AS
date, dsp_id, bid;
norm_data -> tuple с именованными полями и обрезанной датой---------------------------------------date dsp_id bid---------------------------------------(2014.02.14, DSP-2, 12)
(2014.02.14, DSP-1, 56)
(2014.02.14, DSP-2, 89)
(2014.02.14, DSP-1, 21)
Pig - итеративная обработка данных (FOREACH - GENERATE)
--Сгруппируем по dsp_id и date
group_norm_data = GROUP norm_data BY (dsp_id, date);
group_norm_data -> (группа как ключ) : [ (norm_data), (norm_data) ]------------------------------------------------------------------------------------------------------------- group array [norm_data, ...]-------------------------------------------------------------------------------------------------------------( (DSP-1, 2014.02.14), {(2014.02.14, DSP-1, 56), (2014.02.14, DSP-1, 21)} )
( (DSP-1, 2014.02.17), {(2014.02.17, DSP-1, 34), (2014.02.17, DSP-1, 24)} )
( (DSP-2, 2014.02.14), {(2014.02.14, DSP-2, 89), (2014.02.14, DSP-2, 12)} )
Pig - группировка данных (GROUP)
список агрегатов c префиксомnorm_data
-- Разворачивает агрегаты в линейную структуру ft_group_norm_data = FOREACH group_norm_data GENERATE FLATTEN(group), FLATTEN(norm_data);
ft_group_norm_data -> tuple с именованными полями---------------------------------------------------------------------- dsp_id, date date dsp_id bid-----------------------------------------------------------------------(DSP-1, 2014.02.14, 2014.02.14, DSP-1, 56)
(DSP-1, 2014.02.14, 2014.02.14, DSP-1, 21)
(DSP-1, 2014.02.15, 2014.02.15, DSP-1, 15)
(DSP-1, 2014.02.15, 2014.02.15, DSP-1, 31)
Pig - развертка агрегатов (FLATTEN)
--Посчитаем количество агрегатов в каждой группе
count_agg = FOREACH group_norm_data GENERATE group, COUNT
(norm_data);
count_agg -> группа : $0 /не именованное поле, т.к мы не использовали AS /------------------------------------------------------ group $0 (count)------------------------------------------------------( (DSP-1, 2014.02.14), 2 )
( (DSP-1, 2014.02.15), 3 )
( (DSP-1, 2014.02.16), 2 )
Pig - функции агрегации (COUNT)
--Вычислим сумму ставок сделанной каждым брокером (dsp_id)sum_bids_dsp = FOREACH group_norm_data GENERATE group, SUM(norm_data.bid) AS bids_sum;
sum_bids_dsp -> группа : bids_sum------------------------------------------------------ group bids_sum------------------------------------------------------( (DSP-1, 2014.02.16), 82)( (DSP-1, 2014.02.17), 58)( (DSP-2, 2014.02.14), 101)( (DSP-2, 2014.02.16), 58)
Pig - функции агрегации (SUM)
--Вычислим общую сумму, и количество групп.--Для этого смержим всё вместе.group_all = GROUP sum_bids_dsp ALL;
( all, { ((DSP-1,2014.02.14),77), ((DSP-1,2014.02.15),67), ((DSP-1,2014.02.16),82),((DSP-1,2014.02.17),58),((DSP-2,2014.02.14),101),((DSP-2,2014.02.16),58),((DSP-2,2014.02.17),123),((DSP-3,2014.02.14),22),((DSP-3,2014.02.15),109),((DSP-3,2014.02.16),136),((DSP-3,2014.02.17),81) } )
--и вычислим количество и суммуsummary = FOREACH group_all GENERATE COUNT(sum_bids_dsp), SUM(sum_bids_dsp.bids_sum);
------------------------------------------------------ count sum------------------------------------------------------(11, 914)
Pig - GROUP ALL
Резюме
● Hive хорош для небольших и несложных выборок. HQL похож на SQL, поэтому можно очень быстро начать работать с Hive.
● PigТребует изучения языка и структур данных. Но зато, разобравшись один раз, вы получаете более мощный инструмент, в котором легче реализовывать сложные и многоступенчатые выборки. Вы получаете простой и упорядоченный код, с доступными и уместными комментариями
Вопросы?