Големи данни от А до Я
Здравей, Habr! В тази статия ще продължим да разглеждаме възможностите на hive, двигател, който превежда SQL-подобни заявки в MapReduce задачи.
В предишната статия разгледахме основните характеристики на кошера, като създаване на таблици, зареждане на данни и изпълнение на прости заявки SELECT. Сега нека поговорим за разширени функции, които ще ви позволят да извлечете максимума от Hive.
Дефинирани от потребителя функции
Една от основните пречки при работа с Hive е ограничението в рамките на стандартния SQL. Този проблем може да бъде решен чрез използване на езикови разширения - така наречените "User Defined Functions". Доста полезни функции са вградени направо в езика Hive. Ето някои от най-интересните според мен (информацията е взета от официалната документация):
Доста често срещана задача при работа с големи данни е обработката на неструктурирани данни, съхранявани във формат json. За да работите с json hive, поддържайте специален методget_json_object, който ви позволява да извличате стойности от json документи. Ограничена версия на нотацията JSONPath се използва за извличане на стойности от обект. Поддържат се следните операции:
- $: Връща основния обект
- .: Връща дъщерен обект
- []: Достъп по индекс в масив
- *: Заместващ знак за
Нека има таблица: src_json, състояща се от една колона (json) и един ред:
Примери за заявки към таблицата:
По същия начин, ако данните, които трябва да бъдат обработени с помощта на hive, не се съхраняват в json, а в XML, те могат да бъдат обработени с помощта на функциятаxpath,, която позволяваанализирайте XML с помощта на подходящия език. Пример за анализиране на xml данни с помощта на xpath:
Други полезни вградени функции:
Вградената библиотека съдържа доста богат набор от вградени функции. Могат да се разграничат няколко групи:
- Математически функции (sin, cos, log, ...)
- Времеви функции (from_unix_timestamp, to_date, текуща дата, час(низова дата), timediff, ...) - много богат избор от функции за конвертиране на дати и часове
- Функции за работа с низове. Поддържат се както общоприложими функции, като lengh, reverse, regexp, така и специфични, като parse_url или get_json_object, които вече бяха обсъдени)
- Много различни системни функции - current_user, current_database, ...
- Криптографски функции - sha, md5, aes_encrypt, aes_decrypt.
Писане на собствени UDF
Не винаги има достатъчно вградени функции в кошера за решаване на проблема. Ако няма вградена функция, можете да напишете свой собствен UDF. Това се прави в java.
Нека анализираме създаването на нашия собствен UDF, използвайки примера на проста функция за преобразуване на низ в малки букви:
1. Създайте пакет com/example/hive/udf и създайте класа Lower.java в него:
2. Нека внедрим самия Долен клас:
3. Добавете необходимите библиотеки към CLASSPATH (във вашето разпространение на hadoop връзките към jar файлове може да са малко по-различни):
4. Компилирайте нашия UDF и създайте jar архива:
5. За да можете да използвате функция в кошер, трябва изрично да я декларирате:
Трансформиране на таблица със скриптове
Друг начин за разширяване на стандартаФункционалността на HIVE е използването на метода TRANSFORM, който ви позволява да трансформирате данни с помощта на персонализирани скриптове на всеки език за програмиране (това е особено подходящо за тези, които не харесват java и не искат да пишат udfs на него).
Синтаксисът за използване на командата е както следва: