SQLとHbaseの操作比較

出典: LunaBiblos

Software > DataBase > KeyValueストア > HBaseの利用 > SQLとHbaseの操作比較

目次

概要

ここではHbaseで使われるHbase Shellに関しての説明を行います。従来のSQLの処理と、それに相当するHbase Shellの書き方を並べて記述しています。
基本的にこのSQLをHbase Shellで書いたら、を解説します。
Hbase Shell独自の機能はHbase独自のtable/Data操作を参照してください。

RDBが二次元構造だったのに対してHbaseは三次元構造になっている為、最初はちょっと解りにくいかも知れません。

RDBとHBaseの差異

全て主語は「Hbase」です。

  • IndexはCreate文ではなくInsert文で作る
  • Indexに相当するKeyのみが検索条件の対象と成ります。
  • Tableの有効無効概念があり、無効状態のTableのみが削除可能
  • Timestampの概念を標準で保持している。

Table作成

ポケモンIDがIndexKeyでポケモンID(POKE_ID)、身長(HEIGHT)、ポケモン名称(NAME)の三つの項目を持ったポケモン情報のTableを作ります。

SQLHbase Shell
CREATE TABLE 'Pokemon' (
 'POKE_ID' NUMBER(10),
 'HEIGHT' NUMBER(10),
 'NAME' NVARCHAR2(10)
)
CREATE UNIQUE INDEX 'Pokemon_Key'
 ON 'Pokemon' ('POKE_ID');
create 'Pokemon', {NAME=>'POKE_ID'}, {NAME=>'HEIGHT'}, {NAME=>'NAME'}

Table構成変更

作業SQLHbase Shell
体重(WEIGHT)の追加ALTER TABLE 'Pokemon' ADD 'WEIGHT' NVARCHAR(10);disable 'Pokemon'
alter 'Pokemon', {NAME=>'WEIGHT'}
enable 'Pokemon'
体重(WEIGHT)の削除ALTER TABLE 'Pokemon' DROP 'WEIGHT';disable 'Pokemon'
alter 'Pokemon', {NAME=>'WEIGHT', METHOD=>'delete'}
enable 'Pokemon'

Table削除

SQLHbase Shell
drop table 'Pokemon';disable 'Pokemon'
drop 'Pokemon'

Data登録

ポケモンIDがIndexKeyでポケモンIDが「10001」、身長が「30」、ポケモン名称「PIKACHU」のポケモンを登録します。

SQLHbase Shell
INSERT INTO 'Pokemon'
  (POKE_ID,HEIGHT,NAME)
VALUES
 (10001,30,'PIKACHU');
put 'Pokemon', '10001', 'POKE_ID', '10001', 20090929
put 'Pokemon', '10001', 'HEIGHT', '30', 20090929
put 'Pokemon', '10001', 'NAME', 'PIKACHU', 20090929

Data取得

条件は全て「ポケモンIDが「10001」」です。

取得方法SQLHbase Shell
全項目を取得SELECT * FROM Pokemon
 WHERE POKE_ID = 10001;
get 'Pokemon', '10001'
ポケモンの名前を取得SELECT NAME FROM Pokemon
 WHERE POKE_ID = 10001;
get 'Pokemon', '10001', {COLUMN => 'NAME:'}
ポケモンの名前と身長を取得SELECT NAME,HEIGHT FROM Pokemon
 WHERE POKE_ID = 10001;
get 'Pokemon', '10001', {COLUMN => ['NAME:', 'HEIGHT:']}

Data検索

特定の条件を元に名前を取得します。

検索方法SQLHbase Shell
ポケモンIDが10001SELECT NAME FROM Pokemon
 WHERE POKE_ID = 10001;
scan 'Pokemon', {COLUMNS => 'NAME:', STARTROW => '10001', STOPROW=>'10002'}
ポケモン身長が30SELECT NAME FROM Pokemon
 WHERE HEIGHT = 30;
IndexKeyが身長ではないので検索が出来ません

Data削除

検索方法SQLHbase Shell
一括削除truncate table 'Pokemon'truncate 'Pokemon'
ポケモンIDが10001の
身長(HEIGHT)を空にする
UPDATE 'Pokemon' SET 'HEIGHT'=null
 WHERE POKE_ID=10001
delete 'Pokemon', '10001', 'HEIGHT'

Hbase Shellの「truncate」は、内部で「disable drop create」が連続して行われています。