- Authors
- Name
Overview
HBaseのデータをHiveで照会する方法を紹介します。
準備
既存のHiveテーブルにはu_dataというテーブルが存在します。u_dataはMovieLensが提供するデータセットの一部であり、このデータの作成方法はhttps://www.youngju.dev/blog/202211/hive_query_examplを参照してください。
データのスキーマは以下の通りです。
hive> describe u_data;
OK
userid int
movieid int
rating int
unixtime timestamp
Time taken: 0.442 seconds, Fetched: 4 row(s)
Hive-HBaseテーブルの作成方法!
テーブルの作成
hive> CREATE TABLE hbase_u_data(key int, value int)
> STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
> WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val");
OK
Time taken: 2.292 seconds
以下のように、Hiveでテーブルが作成されたことを確認できます。
hive> show tables;
OK
hbase_u_data
さらに、HBaseにもそのテーブルが作成されたことを確認できます。
hbase:001:0> list
TABLE
hbase_u_data
hbase:002:0> desc 'hbase_u_data';
Table hbase_u_data is ENABLED
hbase_u_data, {TABLE_ATTRIBUTES => {METADATA => {'hbase.store.file-tracker.impl' => 'DEFAULT'}}}
COLUMN FAMILIES DESCRIPTION
{NAME => 'cf1', VERSIONS => '1', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_V
ERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', IN_MEMORY => 'false', COMPRESSION => 'NONE', BLOCKCACH
E => 'true', BLOCKSIZE => '65536 B (64KB)', METADATA => {'EVICT_BLOCKS_ON_CLOSE' => 'false', 'NEW_VERSION_BEHAVIOR' =>
'false', 'CACHE_DATA_ON_WRITE' => 'false', 'CACHE_INDEX_ON_WRITE' => 'false', 'CACHE_BLOOMS_ON_WRITE' => 'false', 'PR
EFETCH_BLOCKS_ON_OPEN' => 'false', 'CACHE_DATA_IN_L1' => 'false'}}
1 row(s)
Quota is disabled
Took 0.0953 seconds
データの挿入
HiveテーブルのデータをHBaseテーブルにinsertします。
hive> INSERT OVERWRITE TABLE hbase_u_data SELECT userid, rating FROM u_data;
HiveからHBaseにデータを投入した後、行数が異なる場合がありますが、その理由はHiveは重複キーをサポートしますが、HBaseはユニークキーのみをサポートするためです。
hive> select count(*) from hbase_u_data;
OK
943
Time taken: 18.137 seconds, Fetched: 1 row(s)
HBaseテーブルをHive-HBaseテーブルに変換する
既存のHBaseに存在するusertableを、Hiveでも使用できるHive-HBaseテーブルに変換することもできます。
以下はHBase上にのみ存在するusertableです。
hbase:004:0> desc "usertable";
Table usertable is ENABLED
usertable, {TABLE_ATTRIBUTES => {METADATA => {'hbase.store.file-tracker.impl' => 'DEFAULT'}}}
COLUMN FAMILIES DESCRIPTION
{NAME => 'family', BLOOMFILTER => 'ROW', IN_MEMORY => 'false', VERSIONS => '1', KEEP_DELETED_CELLS => 'FALSE', DATA_BL
OCK_ENCODING => 'NONE', COMPRESSION => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE
=> '65536 B (64KB)', REPLICATION_SCOPE => '0'}
HBaseテーブルをHive-HBaseテーブルに変換
"hbase.table.name"の値には、HBaseに現在存在するテーブル名を入力します。
hive> CREATE EXTERNAL TABLE hbase_usertable(key string, value string)
> STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
> WITH SERDEPROPERTIES ("hbase.columns.mapping" = "family:field9")
> TBLPROPERTIES("hbase.table.name" = "usertable")
Time taken: 1.651 seconds
Hiveにhbase_usertableという名前のテーブルが作成されたことを確認できます。
hive> desc hbase_usertable;
OK
key string
value string
行数を確認して、HBaseの既存テーブルの行数とHive-HBaseテーブルの行数が一致するかチェックし、正しく作成されたことを確認します。
hive> select count(distinct key) from hbase_usertable;
Total MapReduce CPU Time Spent: 4 minutes 42 seconds 330 msec
OK
1000
以降は、このテーブルにHiveからinsertしたり、HBaseからinsertした場合、そのデータをHiveとHBaseの両方から照会できます。
より多様なユースケースについてはhttps://cwiki.apache.org/confluence/display/Hive/HBaseIntegrationを参照してください。