Big Data від A до Я
Привіт, Хабре! У цій статті ми продовжимо розглядати можливості hive - движка, що транслює SQL-like запити в MapReduce завдання.
У попередній статті ми розглянули базові можливості hive, такі як створення таблиць, завантаження даних, виконання простих запитів SELECT. Тепер поговоримо про просунуті можливості, які дозволять вичавлювати максимум з Hive.

User Defined Functions
Однією з основних перешкод при роботі з Hive є скутість рамками стандартного SQL. Цю проблему можна вирішити за допомогою використання розширень мови - так званих "User Defined Functions". Досить багато корисних функцій вставлено прямо в мову Hive. Наведу кілька найцікавіших на мій погляд (інформацію взято з офіційної документації):
Досить частою задачею при роботі з великими даними є обробка неструктурованих даних, що зберігаються у форматі json. Для роботи з json hive підтримувати спеціальний методget_json_object, що дозволяє отримувати значення з json-документів. Для отримання значень з об'єкта використовується обмежена версія нотації JSONPath. Підтримуються такі операції:
- $: Повертає кореневий об'єкт
- .: Повертає об'єкт-дитина
- []: Звернення за індексом у масиві
- *: Wildcard для
Нехай є таблиця: src_json, що складається з однієї колонки (json) та одного рядка:
Приклади запитів до таблиці:
Аналогічно, якщо дані, які необхідно обробляти за допомогою hive, зберігаються не в json, а в XML - їх можна обробляти за допомогою функціїxpath,що дозволяєпарсить XML за допомогою відповідної мови. Приклад парсингу xml-даних за допомогою xpath:
Інші корисні вбудовані функції:
Вбудована бібліотека містить досить багатий набір вбудованих функцій. Можна виділити кілька груп:
- Математичні функції (sin, cos, log, …)
- Функції роботи з часом (from_unix_timestamp, to_date, current date, hour(string date), timediff, …) — дуже багатий вибір функцій перетворення дат і часу
- Функції до роботи з рядками. Підтримуються як загальноприйнятні функції, такі як lengh, reverse, regexp, так і специфічні типу parse_url або вже розглянутої get_json_object)
- Багато різних системних функцій - current_user, current_database, …
- Криптографічні функції - sha, md5, aes_encrypt, aes_decrypt.
Написання власних UDF
Не завжди буває достатньо вбудованих у його функцій для вирішення поставленої задачі. Якщо вбудованої функції не знайшлося, можна написати свою UDF. Робиться це мовою java.
Розберемо створення власної UDF на прикладі простої функції перетворення рядка в lowercase:
1. Створимо пакет com/example/hive/udf і створимо в ньому клас Lower.java:
2. Реалізуємо власне клас Lower:
3. Додамо необхідні бібліотеки в CLASSPATH (у вашому hadoop-дистрибутиві посилання на jar-файли можуть бути трохи іншими):
4. Компілюємо нашу UDF-ку і збираємо jar-архів:
5. Для того, щоб можна було використовувати функцію в hive - потрібно явно її декларувати:
Трансформація таблиці за допомогою скриптів
Ще одним способом розширення стандартногоФункціоналом HIVE є використання методу TRANSFORM, який дозволяє перетворювати дані за допомогою кастомних скриптів будь-якою мовою програмування (особливо це підходить тим хто не любить java і не хоче писати на ній udf-ки).
Синтаксис для використання команди наступний: