Главная страница Новости кинофильмов Игровые новости Новости спорта Новости технологий

Два улья UDAF для преобразования агрегации в карту

Новости

Я публикую два новых Hive UDAF, которые помогут с картами в Apache Hive. Исходный код доступен на GitHub в двух Java-классах: “UDAFToMap” и “UDAFToOrderedMap”, или вы можете загрузить jar-файл. Первая функция преобразует статистические данные в карту и внутренне использует Java HashMap. Вторая функция расширяет первую. Он преобразует агрегацию в упорядоченную карту и внутренне использует древовидную карту Java.

API

Напомним, что UDF означает определяемую пользователем функцию, а UDAF — это для определенной пользователем агрегатной функции. Если UDF — это пользовательская скалярная функция для одного или нескольких столбцов в одной строке (например, функция CONCAT в SQL), то UDAF работает с агрегированием одного или нескольких столбцов (например, функция MAX в SQL).

MAP to_map(примитивная, primitive_or_complex) КАРТА to_ordered_map(primitive, primitive_or_complex)

Обе функции используют один и тот же API. Они принимают два аргумента: первый — это ключ, а второй — значение. Ключи могут быть любого примитивного типа. Значения могут быть примитивного или сложного типа. В Hive примитивными типами являются integer, boolean, число с плавающей запятой, string, дата и двоичный код, в то время как сложными типами являются structure, map и array.

Мотивация

Работая над временными рядами в Hive, я создал эти функции, исходя из следующих потребностей:

Использование

Рассмотрим следующий набор исходных данных, состоящий из 4 столбцов (идентификатор клиента, временная метка, значение счетчика, состояние счетчика):

195100,1199145600,607527807,B 185100,1199145600,775031942,A 195100,1199156400,607532682,B 185100,1199156400,775032584,A 195100,1199167200,607535485,B 185100,1199167200,775033200,A 195100,1199178000,582924326,C 185100,1199178000,775034241,A 195100,1199188800,582927007,C 185100,11991888800,775035698,A 195100,1199199600,582929212,C 185100,1199199600,775036891,A 195100,1199210400,582932070,C 185100,1199210400,775038268,A 195100,1199221200,582935353,B 185100,1199221200,775039703,

Источник CSV импортируется в Hive со следующими инструкциями:

УДАЛИТЬ источник ТАБЛИЦЫ; СОЗДАТЬ источник ТАБЛИЦЫ (customer INT, emission INT, value INT, state STRING ) ПОЛЯ С РАЗДЕЛИТЕЛЯМИ В ФОРМАТЕ СТРОК, ЗАКАНЧИВАЮЩИЕСЯ СИМВОЛОМ ‘, СТРОКИ, ЗАКАНЧИВАЮЩИЕСЯ СИМВОЛОМ ‘n’, СОХРАНЕННЫЕ В ВИДЕ ТЕКСТОВОГО ФАЙЛА; ЗАГРУЖАЕМ ДАННЫЕ ПО ЛОКАЛЬНОМУ ПУТИ INPATH ‘./sample/data.csv’, ПЕРЕЗАПИСЫВАЕМ В исходную ТАБЛИЦУ;

Теперь мы можем объявить наши два UDAF:

ДОБАВЛЯЕМ JAR./target/adaltas-hive-udf-0.0.1-SNAPSHOT.jar; СОЗДАЕМ ВРЕМЕННУЮ ФУНКЦИЮ to_map как ‘com.adaltas.UDAFToMap’; СОЗДАЕМ ВРЕМЕННУЮ ФУНКЦИЮ to_ordered_map как ‘com.adaltas.UDAFToOrderedMap»;

И, наконец, мы можем использовать их со следующими запросами:

# Реализация хэш-карты ВЫБЕРИТЕ «клиент», to_map(from_unixtime(эмиссия), массив(значение,состояние)) ИЗ группы «источник» ПО «клиенту»; # Реализация упорядоченной хэш-карты ВЫБЕРИТЕ «клиент`, to_ordered_map(from_unixtime(выброс), array(значение,состояние)) ИЗ ГРУППЫ `source` ПО `customer`;

Вывод последнего оператора select выглядит следующим образом:

185100 { «2008-01-01 01:00:00″:[ fusion_builder_container сто_процентный=»да»overflow=»видимый»][fusion_builder_row][fusion_builder_column тип столбца=»1_1″ фоновое положение =»слева вверху» фоновый цвет =»» размер границы =»» цвет границы =»» стиль границы =»сплошной» интервал=»да» фоновое изображение =»» фоновое повторение =»без повтора» отступы=»» margin_top=»0 пикселей» margin_bottom=»0 пикселей» class=»» id=»» animation_type=»» скорость анимации=»0,3″ animation_direction=»влево» hide_on_mobile=»нет» center_content=»нет» min_height=»нет»][«775031942″,»A»], «2008-01-01»][«775031942″,»A»], «2008-01-01 04:00:00»:[«775032584″,» А»], «2008-01-01 07:00:00»:[«775033200″,» А»], «2008-01-01 10:00:00»:[«775034241″,» А»], «2008-01-01 13:00:00»:[«775035698″,» А»], «2008-01-01 16:00:00»:[«775036891″,» А»], «2008-01-01 19:00:00»:[«775038268″,» А»], «2008-01-01 22:00:00»:[«775039703″,»A»] } 195100 { «2008-01-01 01:00:00»:[«607527807″,» B»], «2008-01-01 04:00:00»:[«607532682″,» B»], «2008-01-01 07:00:00»:[«607535485″,»B»], «2008-01-01 10:00:00»:[«582924326″,»C»], «2008-01-01 13:00:00»:[«582927007″,» C»], «2008-01-01 16:00:00»:[«582929212″,»C»], «2008-01-01 19:00:00»:[«582932070″,»C»], «2008-01-01 22:00:00»:[«582935353″,»B»]}

Если вы клонировали наш репозиторий на GitHub, вы можете запустить приведенный выше пример с помощью команды mvn install && hive -f sample/to_map.hive.

Во время написания этой статьи я также опубликовал проблему с улучшением JIRA (HIVE-2843), в которой предлагается интегрировать исходный код в Hive. Я подготовлю патч для его включения в Hive, если сообщество проявит интерес.


Другие новости: