21
На что мне столько разных штук? Hive vs Pig Лучше день потерять, но потом за пять минут долететь (с) Анатолий Никулин

Hive vs Pig

Embed Size (px)

DESCRIPTION

Сравниваем Hive и Pig. Две ETL системы для работы с большими данными/

Citation preview

Page 1: Hive vs Pig

На что мне столько разных штук?Hive vs Pig

Лучше день потерять, но потом за пять минут долететь (с)

Анатолий Никулин

Page 2: Hive vs Pig

Hive

● SQL-like язык HQL

● Интерактивная консоль

● Встроенные функции агрегации

● Поддержка UDF (Java, Python)

● Данные - как таблица

Page 3: Hive vs Pig

Hive - плюсы

● Старый добрый SQL. Хорош для описания выборок, да и просто, все его знают.

● Формирование MR Job под капотом. Уходит много оверхеда, связанного с обвязкой вокруг MR. Описание моделей данных, входных и выходных форматов, цепочек MR задач.

● Интерактивность. Хорош для анализа данных в разных срезах.

● Быстрота разработки. Отсутствие зависимостей, сборки, unit-тестов

Page 4: Hive vs Pig

Hive - минусы

● Не всё можно уложить в HQL ● Трудно работать с датами● Это хорошо “ложится” в голову, при

простых выборках. Но не легко в случаях

сложных выборок.

Page 7: Hive vs Pig

Ну как вам? (как то грешновато)

● Не хватает какой-то упорядоченности

● Разложить бы всё по полочкам...

Page 8: Hive vs Pig

Pig

● Pig - процедурный подход

● Интерактивная консоль

● Встроенные функции агрегации

● Поддержка UDF (Java, Jython)

● Данные - в виде разных структур.

Page 9: Hive vs Pig

Pig - плюсы

● Процедурный подход. Упорядоченность! Язык позволяет разбивать логику на блоки, каждый шаг можно развернуто описывать комментариями.

● Формирование MR Job под капотом. Уходит много оверхеда, связанного с обвязкой вокруг MR. Описание моделей данных, входных и выходных форматов, цепочек MR задач.

● Интерактивность. Хорош для анализа данных в разных срезах.

● Быстрота разработки. Отсутствие зависимостей, сборки, unit-тестов

Page 10: Hive vs Pig

Pig - минусы

● Не всё можно уложить в язык Pig Latin

● Pig Latin вместе со структурами данных,

более сложен, в отличии от HiveQL

● Для UDF используется Jython. Это может ограничить в использовании некоторых библиотек.

Page 11: Hive vs Pig

Pig - cтруктуры данных

● Tuple - упорядоченный набор полей. Структура, к полям которой можно обращаться по индексу и/или имени

● Bag - коллекция (множество) Tuple.

Page 12: Hive vs Pig

Pig - функции

● LOAD● STORE● GENERATE● JOIN● GROUP● FILTER● UNION● DISTINCT● ORDER

Page 13: Hive vs Pig

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)

Page 14: Hive vs Pig

--Нормализуем данные

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)

Page 15: Hive vs Pig

--Сгруппируем по 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

Page 16: Hive vs Pig

-- Разворачивает агрегаты в линейную структуру 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)

Page 17: Hive vs Pig

--Посчитаем количество агрегатов в каждой группе

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)

Page 18: Hive vs Pig

--Вычислим сумму ставок сделанной каждым брокером (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)

Page 19: Hive vs Pig

--Вычислим общую сумму, и количество групп.--Для этого смержим всё вместе.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

Page 20: Hive vs Pig

Резюме

● Hive хорош для небольших и несложных выборок. HQL похож на SQL, поэтому можно очень быстро начать работать с Hive.

● PigТребует изучения языка и структур данных. Но зато, разобравшись один раз, вы получаете более мощный инструмент, в котором легче реализовывать сложные и многоступенчатые выборки. Вы получаете простой и упорядоченный код, с доступными и уместными комментариями

Page 21: Hive vs Pig

Вопросы?