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)