Hive и HBase

Интеграция Hive/HBase позволяет операторам Hive QL получать доступ к таблицам HBase как для операций чтения (SELECT), так и для операций записи (INSERT). Вы можете создать новую таблицу HBase в Hive или получить доступ к существующей таблице.

Создание новой таблицы HBase в Hive

Чтобы создать новую таблицу HBase, которой можно управлять через Hive, используйте выражение STORED BY в инструкции CREATE TABLE. Оно позволяет указать обработчик хранилища (storage handler), необходимый для интеграции.

Пример:

$ sudo -u hive hive
CREATE TABLE hbase_table_test(key int, value1 string, value2 int, value3 int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,col_family1:val1,col_family1:val2,col_family2:val3")
TBLPROPERTIES ("hbase.table.name" = "hive_test", "hbase.mapred.output.outputtable" = "hive_test");

Где:

  • STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' — указывает обработчик хранилища, который позволяет Hive получать доступ к данным HBase.

  • WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,col_family1:val1,col_family1:val2,col_family2:val3") — определяет соответствие между столбцами HBase и Hive. Параметр hbase.columns.mapping может содержать следующие записи: :key, :timestamp или <column-family-name>:[<column-name>][#(binary|string)]. Спецификация типа отделяется символом #. Если hbase.columns.mapping не включает спецификацию типа, используется значение из hbase.table.default.storage.type.

  • TBLPROPERTIES ("hbase.table.name" = "hive_test", "hbase.mapred.output.outputtable" = "hive_test") — определяет свойства таблицы. Свойство hbase.table.name указывает имя таблицы в HBase. В этом примере имя таблицы в Hive — hbase_table_test, а в HBase — hive_test. Если hbase.table.name не определено, у таблицы будет одно и то же имя и в Hive, и в HBase. Свойство hbase.mapred.output.outputtable необходимо указать, если вы планируете вставлять данные в таблицу (используется классом hbase.mapreduce.TableOutputFormat).

Выполните команду list, чтобы проверить, есть ли в HBase информация о новой таблице:

$ hbase shell

$ list

Вывод команды list должен содержать таблицу hive_test.

В командной строке HBase используйте команду put, чтобы добавить данные в таблицу:

put 'hive_test', '1' , 'col_family1:val1', 'test'
put 'hive_test', '1' , 'col_family1:val2', '1'
put 'hive_test', '1' , 'col_family2:val3', '1'

put 'hive_test', '2' , 'col_family1:val1', 'test2'
put 'hive_test', '2' , 'col_family1:val2', '2'
put 'hive_test', '2' , 'col_family2:val3', '2'

Проверьте содержимое таблицы, выполнив команду scan:

scan 'hive_test'

Результат:

ROW                                                          COLUMN+CELL
1                                                           column=col_family1:val1, timestamp=1694606917613, value=test
1                                                           column=col_family1:val2, timestamp=1694606917647, value=1
1                                                           column=col_family2:val3, timestamp=1694606922996, value=1
2                                                           column=col_family1:val1, timestamp=1694607054746, value=test2
2                                                           column=col_family1:val2, timestamp=1694607054763, value=2
2                                                           column=col_family2:val3, timestamp=1694607056127, value=2
2 row(s)
Took 0.0175 seconds

HBase успешно добавила данные в таблицу, созданную в Hive.

Вставьте новую строку в ту же таблицу через командную строку Hive:

INSERT INTO hbase_table_test VALUES(3,'test3', 3, 3);

Проверьте данные таблицы в оболочке HBase:

scan 'hive_test'

Результат:

ROW                   COLUMN+CELL
 1                    column=col_family1:val1, timestamp=1698334191476, value=test
 1                    column=col_family1:val2, timestamp=1698334191504, value=1
 1                    column=col_family2:val3, timestamp=1698334191538, value=1
 2                    column=col_family1:val1, timestamp=1698334191591, value=test2
 2                    column=col_family1:val2, timestamp=1698334191616, value=2
 2                    column=col_family2:val3, timestamp=1698334193906, value=2
 3                    column=col_family1:val1, timestamp=1698334255870, value=test3
 3                    column=col_family1:val2, timestamp=1698334255870, value=3
 3                    column=col_family2:val3, timestamp=1698334255870, value=3
3 row(s)
Took 0.0133 seconds

Как показано в этом примере, Hive и HBase могут работать с одной и той же таблицей.

Работа с существующей таблицей HBase в Hive

Вы также можете работать с существующей таблицей HBase в Hive. В примере ниже используется таблица people_ages из статьи Массовая загрузка с использованием встроенных задач MapReduce.

Для существующей таблицы HBase необходимо создать внешнюю таблицу в командной строке Hive и указать другие свойства в соответствии со структурой таблицы:

CREATE EXTERNAL TABLE hbase_people_ages  (name string, age int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,basic:age")
TBLPROPERTIES ("hbase.table.name" = "people_ages", "hbase.mapred.output.outputtable" = "people_ages");

Сделайте выборку данных, чтобы проверить, доступна ли таблица:

SELECT * FROM hbase_people_ages LIMIT 5;

Результат:

OK
Abbott Delia    62
Abbott Howard   24
Abbott Jack     29
Adams Clyde     29
Aguilar Myrtie  23
Time taken: 0.161 seconds, Fetched: 5 row(s)

Также можно объединить таблицы HBase с таблицами Hive с помощью операторов JOIN и UNION.

Создайте еще одну таблицу в Hive:

CREATE TABLE people (key int, name string, points int);

INSERT INTO people
    VALUES (1,'Phelps Rena', 35), (2,'Quinn Brian', 48), (1,'Reyes Danny', 52);

Выполните запрос с выражением JOIN:

SELECT hbase_people_ages.*, people.points FROM hbase_people_ages JOIN people ON (hbase_people_ages.name = people.name);

Результат:

OK
Phelps Rena     18      35
Quinn Brian     20      48
Reyes Danny     41      52
Time taken: 10.003 seconds, Fetched: 3 row(s)
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней