Големи данни от А до Я

Здравей, Habr! В тази статия ще продължим да разглеждаме възможностите на hive, двигател, който превежда SQL-подобни заявки в MapReduce задачи.

В предишната статия разгледахме основните характеристики на кошера, като създаване на таблици, зареждане на данни и изпълнение на прости заявки SELECT. Сега нека поговорим за разширени функции, които ще ви позволят да извлечете максимума от Hive.

данни

Дефинирани от потребителя функции

Една от основните пречки при работа с Hive е ограничението в рамките на стандартния SQL. Този проблем може да бъде решен чрез използване на езикови разширения - така наречените "User Defined Functions". Доста полезни функции са вградени направо в езика Hive. Ето някои от най-интересните според мен (информацията е взета от официалната документация):

Доста често срещана задача при работа с големи данни е обработката на неструктурирани данни, съхранявани във формат json. За да работите с json hive, поддържайте специален методget_json_object, който ви позволява да извличате стойности от json документи. Ограничена версия на нотацията JSONPath се използва за извличане на стойности от обект. Поддържат се следните операции:

  • $: Връща основния обект
  • .: Връща дъщерен обект
  • []: Достъп по индекс в масив
  • *: Заместващ знак за
Примери за работа с Json от официалната документация:

Нека има таблица: 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 на него).

Синтаксисът за използване на командата е както следва: