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 для
Приклади роботи з Json з офіційної документації:

Нехай є таблиця: 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.
Повний список вбудованих у hive функцій можна знайти за посиланням.

Написання власних 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-ки).

Синтаксис для використання команди наступний: