Регулярные выражения в Apache HBase

курсы HBase примеры обучение, Apache HBase Hadoop администратор кластера курс, администрирование Apache HBase, NoSQL курсы примеры обучение, Школа Больших Данных Учебный центр Коммерсант

Каждый разработчик и дата-аналитик с закрытыми глазами напишет SQL-запрос с регулярными выражениями для поиска данных по шаблону в реляционной базе. А вот в NoSQL-СУБД такая простая задача реализуется довольно сложно. Как написать регулярное выражение в Apache HBase и запустить его на исполнение в CLI-интерфейсе shell-оболочки этого хранилища данных.

Что такое регулярные выражения и зачем они нужны

В реляционных базах для поиска и замены данных по шаблону активно используются регулярные выражения. Это полезно при проверке данных, поиске дубликатов, выявлении лишних пробелов или парсинге строк, например, при проверке формата телефонного номера, zip-кода, email-адресов, IP-адресов, имен файлов и директорий и пр. Также с регулярными выражениями можно искать комбинации, например, HTML-тегов, чисел, дат, и другие данные, которые могут быть простой строкой или текстом большого объема, хранимым в символьном столбце базы. В общем, регулярные выражения  позволяют искать, заменять и проверять данные, которые соответствуют какому-либо шаблону в тексте, и заменять их другим набором символов.

В большинстве случаев поиск по регулярному выражению бывает очень быстрым, но сами регулярные выражения бывают очень сложными, поэтому иногда их обработка может занять много времени и большой объём памяти. Поэтому следует избегать шаблонов регулярных выражений, поступающих из недоверенных источников и ввести тайм-аут для SQL-операторов.

Впрочем, в реляционных базах регулярные выражения используются довольно часто, чего не скажешь про NoSQL. В частности, Apache HBase по-своему реализует SQL-подобные команды для доступа к данным, хранящимся в HDFS – распределенной файловой системе Hadoop. В отличие от реляционных СУБД, HBase поддерживает только 4 основные действия обработки данных, которые отличаются от классических SQL-запросов:

  • Put– добавить новую или обновить существующую запись;
  • Get – получить данные по определенному первичному ключу. Можно указать семейство столбцов, откуда будет считана информация и количество версий, которые требуется прочитать.
  • Scan – поочередное чтение записей, начиная с указанной. Можно указать запись, до которой следует читать или количество записей, которые необходимо считать. Также в параметрах операции отмечается семейство столбцов, откуда будет производиться чтение и максимальное количество версий для каждой записи.
  • Delete – пометить определенную версию к удалению. Физического удаления при этом не произойдет, оно будет отложено до следующего полного сжатия (Major Compaction). 

Таким образом, Get и Scan — это два способа чтения данных из HBase, помимо ручного разбора H-файлов. Get — это просто сканирование, ограниченное одной строкой. Scan извлекает ноль или более строк таблицы, по умолчанию считывая всю таблицу от начала до конца. Можно ограничить результаты сканирования несколькими различными способами, которые влияют на нагрузку ввода-вывода, сети и обработки на стороне клиента. При использовании Apache HBase в системах машинного обучения это может ускорить работу ML-алгоритмов, что мы рассматриваем в новой статье.

Для тестирования или быстрых запросов можно выполнять сканирование с помощью shell-оболочки HBase, которая позволяет получить доступ к базе данных в интерактивном режиме с помощью CLI-интерфейса интерпретатора команд, написанного на Ruby. Также отметим, что начиная с версии 2.4 Hadoop предоставляет функцию хеджированного чтения, которая отключена по умолчанию. Если чтение из блока данных HBase происходит медленно, клиент HDFS запускает другое параллельное (защищенное) чтение от другой реплики. В результате используется результат того чтения, которое возвращается первым, а незавершенное чтение отменяется. Эта функция помогает в эпизодических ситуациях, когда чтение иногда занимает много времени, а не при системных проблемах. Возвращаясь к вопросу регулярных выражений в Apache HBase, далее рассмотрим пример поиска данных по шаблону.

Фильтрация данных в стиле регулярных выражений в Apache HBase

Предположим, надо получить из таблицы f1_drivers всех пилотов, чьи фамилии начинаются на «HAM». В реляционных базах это реализуется с использованием предиката LIKE. В Apache HBase подобные SQL-команды отсутствуют, но есть настраиваемые фильтры, которые можно использовать при чтении данных с помощью операций Get или Scan, чтобы вернуть подмножество результатов. Хотя это не уменьшает количество операций ввода-вывода на стороне сервера, нагрузка на сеть чуть снижается и уменьшается объем данных, которые необходимо обработать клиенту. Фильтры обычно используются с помощью Java API, но их можно использовать из HBase Shell для тестирования и отладки.

Apache HBase regexp пример SQL NoSQL
Пример регулярного выражения с SQL-предикатом LIKE и фильтрами в Apache HBase

Фильтры HBase принимают ноль или более аргументов в скобках. Если аргумент является строкой, он заключается в одинарные кавычки. Прежде чем запускать в HBase запрос  с фильтрами, надо импортировать все следующие классы:

import org.apache.hadoop.hbase.filter.SingleColumnValueFilter
import org.apache.hadoop.hbase.filter.CompareFilter
import org.apache.hadoop.hbase.filter.BinaryComparator
import org.apache.hadoop.hbase.filter.RegexStringComparator

Затем можно выполнить запрос в shell-оболочке HBase:

scan ‘f1Drivers’, {FILTER => SingleColumnValueFilter.new(Bytes.toBytes(‘name’), 
Bytes.toBytes(‘last_name’), CompareFilter::CompareOp.valueOf(‘EQUAL’), 
RegexStringComparator.new(“^HAM.*”)), LIMIT => 10}

Поскольку в системах аналитики больших данных хранится очень много информации, в запросах на выборку данных рекомендуется всегда добавлять оператор LIMIT, который ограничит выдаваемый объем 10-ю результатами, найденными первыми. О том, как реализовать привычный многим дата-аналитикам оператор соединения таблиц JOIN в Apache HBase, читайте в нашей новой статье.

Освойте администрирование и эксплуатацию Apache HBase и других NoSQL-решений для аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Я даю свое согласие на обработку персональных данных и соглашаюсь с политикой конфиденциальности.

Источники

  1. https://medium.com/@cupreous.bowels/how-to-regex-in-hbase-shell-4eb952ef7214
  2. https://docs.cloudera.com/documentation/enterprise/6/6.3/topics/admin_hbase_filtering.html
  3. https://docs.cloudera.com/documentation/enterprise/6/6.3/topics/admin_hbase_scanning.html
Поиск по сайту