本記事では、例を通じてOBKV-HBaseクライアントを使用してデータを処理する方法を紹介します。
前提条件
クライアントでデータ操作を実行する前に、以下の条件を満たしていることを確認してください:
OceanBase Cloudにログインし、OceanBaseクラスタインスタンスとテナントを作成していること。作成方法については、インスタンスの作成およびテナントの作成を参照してください。
データベースが作成されていること。
OBKV-HBaseデータテーブルが作成されていること。詳細については、データモデル設計を参照してください。
この例では、
htable1$familyテーブルを使用します。以下のステートメントを参考にこのテーブルを作成できます:CREATE TABLEGROUP htable1; CREATE TABLE htable1$family ( K varbinary(1024), Q varbinary(256), T bigint, V varbinary(1048576) NOT NULL, PRIMARY KEY(K, Q, T)) TABLEGROUP = htable1 ;
注意事項
- 以下の例の実行結果は操作の順序に依存します。結果を再現するには、各操作を順番に実行してください。
- データベース内の操作結果を直感的に確認するため、以下の例ではMySQLクライアントを使用してOBKV-HBaseに接続し、SQLを実行して
htable1$familyテーブルの状態を照会します。
Put
機能説明:
- データを挿入するために使用されます。
関数プロトタイプ:
- void put(Put put)
- void put(List
puts)
パラメータ:
put:単一レコードを挿入するために使用されるPutオブジェクト。puts:複数のレコードを一括挿入するために使用されるPutオブジェクトのリスト。
例:
// 単一レコードを挿入します。
String key = "testKey0";
String family = "family";
String column = "column";
String value = "putValue";
Put put = new Put(key.getBytes());
put.add(family.getBytes(), column.getBytes(), value.getBytes());
hTable.put(put);
// 複数レコードを挿入します。
Put put1 = new Put(Bytes.toBytes("testKey1"));
put1.add(toBytes(family), toBytes(column), toBytes(value));
//put1.add(toBytes(family), toBytes(column), System.currentTimeMillis(), toBytes(value));
Put put2 = new Put(Bytes.toBytes("testKey2"));
put2.add(toBytes(family), toBytes(column), toBytes(value));
//put2.add(toBytes(family), toBytes(column), System.currentTimeMillis(), toBytes(value));
List<Put> puts = new ArrayList<Put>();
puts.add(put1);
puts.add(put2);
hTable.put(puts);
MySQL [test]> select * from htable1$family;
+----------+--------+----------------+----------+
| K | Q | T | V |
+----------+--------+----------------+----------+
| testKey0 | column | -1715961035391 | putValue |
| testKey1 | column | -1715961035471 | putValue |
| testKey2 | column | -1715961035471 | putValue |
+----------+--------+----------------+----------+
説明:
- 上記の例では、データベースに3つのCellを挿入します。
Get
機能説明:
- 指定された行のデータを取得するために使用されます。
関数プロトタイプ:
- Result get(final Get get)
- Result[] get(List
gets)
パラメータ:
get:Getオブジェクト。addColumnまたはaddFamily関数で操作対象を指定します。gets:Getオブジェクトのリスト。
例:
// 1つのファミリを取得します。
String key = "testKey0";
String family = "family";
int maxVersion = 1;
Get get = new Get(key.getBytes());
get.addFamily(family.getBytes());
get.setMaxVersions(maxVersion);
Result result = hTable.get(get);
if (result.list() != null) {
System.out.printf("Get Demo: get cnt:%d%n", result.list().size());
}
String key = "testKey0";
Get get = new Get(key.getBytes());
Result result = hTable.get(get);
if (result.list() != null) {
System.out.printf("Get Demo: get cnt:%d%n", result.list().size());
}
MySQL [test]> select * from htable1$family where k = "testKey0";
+----------+--------+----------------+----------+
| K | Q | T | V |
+----------+--------+----------------+----------+
| testKey0 | column | -1715961561057 | putValue |
+----------+--------+----------------+----------+
説明:
- HBaseにデータバージョンが1つしか存在しない場合、この例でのGet操作は上記のSQLステートメントと意味が等価です。
- Get操作はPut操作の後に実行されるため、データベースには主キーが
testKey0のCellが既に存在します。
Scan
機能説明:
- 指定された条件(
scan、family、またはqualifier)に基づいてテーブルをスキャンします。
関数プロトタイプ:
- ResultScanner getScanner(byte[] family, byte[] qualifier)
- ResultScanner getScanner(final byte[] family)
- ResultScanner getScanner(final Scan scan)
パラメータ:
family:フィルタリングの対象となるファミリー。qualifier:フィルタリングの対象となる列名。scan:Scanオブジェクト。addFamilyまたはaddColumn関数を使用して操作対象を指定します。
例:
String startKey = "testKey";
String endKey = "testKey9";
String family = "family";
String column = "column";
int maxVersion = 1;
Scan scan = new Scan();
scan.addColumn(family.getBytes(), column.getBytes());
scan.setMaxVersions(maxVersion);
scan.setStartRow(startKey.getBytes());
scan.setStopRow(endKey.getBytes());
ResultScanner scanner = hTable.getScanner(scan);
for (Result r : scanner) {
for (KeyValue kv : r.list()) {
System.out.printf("Scan Demo: Rowkey: %s, Column Family: %s, Column Qualifier: %s, Value: %s, Timestamp: %d%n",
Bytes.toString(r.getRow()),
Bytes.toString(kv.getFamily()),
Bytes.toString(kv.getQualifier()),
Bytes.toString(kv.getValue()),
kv.getTimestamp());
}
}
MySQL [test]> select * from htable1$family where k >= "testKey" && k < "testKey9";
+----------+--------+----------------+----------+
| K | Q | T | V |
+----------+--------+----------------+----------+
| testKey0 | column | -1715961561057 | putValue |
| testKey1 | column | -1715961561132 | putValue |
| testKey2 | column | -1715961561132 | putValue |
+----------+--------+----------------+----------+
説明:
- HBaseにデータバージョンが1つしか存在しない場合、この例でのScan操作は上記のSQL文と意味が等価です。
- HBase 0.94では、
startKeyとendKeyは左閉右開区間を定義するため、スキャン結果にはendKeyは含まれません。 - Scan操作はPut操作の後に実行されるため、データベースにはすでに条件を満たす3つのCellが存在します。
インクリメント列値
機能説明:
- 指定された行の単一列に対して自動インクリメント操作を実行します。実行成功後、その列の新しい値を返します。この列のCellは、64ビット整数を格納するために
long型である必要があります。
関数プロトタイプ:
- long incrementColumnValue(byte[] row, byte[] family, byte[] qualifier, long amount, boolean writeToWAL)
パラメータ:
row:行キー。family:テーブル作成時に指定した対象のカラムファミリ。qualifier:対象の列名。amount:増分ステップサイズ。負の数を指定できます。writeToWAL:プリフライトログに書き込むかどうかを指定します。OBKV-HBaseではこのパラメータの設定は不要です。
例:
// 単一列を1増やす。
String column = "incrementColumn";
String key = "incrementKey";
String family = "family";
long increment_value = 1L;
long ret = hTable.incrementColumnValue(
key.getBytes(),
family.getBytes(),
column.getBytes(),
increment_value);
System.out.printf("Increment Column Demo: ret: %b%n", ret);
MySQL [test]> select *,hex(v) from htable1$family where k = "incrementKey";
+--------------+-----------------+----------------+----------+------------------+
| K | Q | T | V | hex(v) |
+--------------+-----------------+----------------+----------+------------------+
| incrementKey | incrementColumn | -1715961669857 | | 0000000000000001 |
+--------------+-----------------+----------------+----------+------------------+
説明:
- MySQLクライアントを使用してHBaseテーブルを表示する場合、CellのV列に内容が表示されないことがあります。その場合は
hex(v)列から値を確認できます。 - インクリメント列値で条件に合致するCellが見つからない場合、まずデフォルト値
0のCellを作成し、その後自動インクリメントを実行します。
インクリメント
機能の概要:
- 指定された行の1つまたは複数の列に対して、自動インクリメント操作を実行します。関連する列のセルは、64ビット整数を格納するために
long型である必要があります。
関数のプロトタイプ:
- Result increment(Increment increment)
パラメータ:
increment:Incrementオブジェクト。addColumn関数を使用してプロパティを設定します。
例:
// 単一の列を1増やします。
String column = "incrementColumn";
String key = "incrementKey";
String family = "family";
long increment_value = 1L;
Increment increment = new Increment(key.getBytes());
increment.addColumn(family.getBytes(), column.getBytes(), increment_value);
Result r = hTable.increment(increment);
for (KeyValue kv : r.list()) {
System.out.printf("Increment Demo: Rowkey: %s, Value:%s%n",
Bytes.toString(r.getRow()),
Bytes.toLong(kv.getValue()));
}
MySQL [test]> select *,hex(v) from htable1$family where k = "incrementKey";
+--------------+-----------------+----------------+----------+------------------+
| K | Q | T | V | hex(v) |
+--------------+-----------------+----------------+----------+------------------+
| incrementKey | incrementColumn | -1715961734681 | | 0000000000000002 |
| incrementKey | incrementColumn | -1715961669857 | | 0000000000000001 |
+--------------+-----------------+----------------+----------+------------------+
説明:
- 同一のセルに対してIncrementを複数回呼び出すと、複数のバージョンが生成されます。HBaseはUpdate操作のセマンティクスをサポートしていないため、セルを変更するたびに新しいバージョンが生成されます。クエリ時にバージョンを指定できます。
Append
機能の概要:
- 指定された行の1つまたは複数の文字型列(例:
byteまたはstring型)にデータを追加します。
関数プロトタイプ:
- Result append(Append append)
パラメータ:
append:Appendオブジェクト。add関数を使用してプロパティを設定します。
例:
String column = "appendColumn";
String key = "appendKey";
String family = "family";
Append append = new Append(key.getBytes());
append.add(family.getBytes(), column.getBytes(), toBytes("_append"));
Result r = hTable.append(append);
for (KeyValue kv : r.list()) {
System.out.printf("Appand Demo: Rowkey: %s, Append Value:%s%n",
Bytes.toString(r.getRow()),
Bytes.toString(kv.getValue()));
}
MySQL [test]> select * from htable1$family where k = "appendKey";
+-----------+--------------+----------------+---------+
| K | Q | T | V |
+-----------+--------------+----------------+---------+
| appendKey | appendColumn | -1715961265748 | _append |
+-----------+--------------+----------------+---------+
説明:
- Appendが条件に合致するCellを見つけられない場合、まずデフォルト値である空文字列のCellを挿入し、その後データを追加します。
Delete
機能説明:
- 指定されたCellまたは行を削除するために使用されます。
関数プロトタイプ:
- void delete(Delete delete)
- void delete(List
deletes)
パラメータ:
deletes:削除するCellまたは行を表すDeleteオブジェクトで、deleteColumnまたはdeleteFamily関数によって指定します。
例:
// 指定されたkey、family、columnを持つ行を削除します。
String key = "testKey1";
String family = "family";
String column = "column";
Delete delete = new Delete(key.getBytes());
delete.deleteColumn(family.getBytes(),column.getBytes());
hTable.delete(delete);
MySQL [test]> select * from htable1$family;
+--------------+-----------------+----------------+----------+
| K | Q | T | V |
+--------------+-----------------+----------------+----------+
| appendKey | appendColumn | -1715961265748 | _append |
| incrementKey | incrementColumn | -1715961228139 | |
| incrementKey | incrementColumn | -1715961188112 | |
| testKey0 | column | -1715961035391 | putValue |
| testKey2 | column | -1715961035471 | putValue |
+--------------+-----------------+----------------+----------+
説明:
- 上記のクエリ結果から、主キーが
testKey1のCellはすべて削除されたことが確認できます。
Exists
機能説明:
Getオブジェクトで指定されたカラムファミリまたは列が存在するかどうかを判断します。存在する場合はtrueを返し、存在しない場合はfalseを返します。
関数プロトタイプ:
- boolean exists(Get get)
パラメータ:
get:Getオブジェクト。addFamilyまたはaddColumn関数を使用して操作対象を指定します。
例:
String key = "testKey2";
String family = "family";
Get get = new Get(key.getBytes());
get.addFamily(family.getBytes());
boolean ret = hTable.exists(get);
System.out.printf("Exist Demo: ret: %b%n", ret);
MySQL [test]> select * from htable1$family where k = "testKey2";
+----------+--------+----------------+----------+
| K | Q | T | V |
+----------+--------+----------------+----------+
| testKey2 | column | -1715961561132 | putValue |
+----------+--------+----------------+----------+
説明:
- Exists と Get の意味は同じです。
Check And Put
機能説明:
- 指定された列のデータをチェックして置き換えます。該当列が存在し、置き換えに成功した場合は
trueを返し、そうでない場合はfalseを返します。
関数プロトタイプ:
- boolean checkAndPut(byte[] row, byte[] family, byte[] qualifier, byte[] value, Put put)
パラメータ:
row:ターゲット行キー。family:ターゲットカラムファミリー。qualifier:ターゲット列名。value:ターゲット列の値。put:新しい列値。
例:
String key = "testKey2";
String family = "family";
String column = "column";
String value = "putValue";
String new_value = "value_new";
Put put = new Put(key.getBytes());
put.add(family.getBytes(), column.getBytes(), new_value.getBytes());
boolean ret = hTable.checkAndPut(
key.getBytes(),
family.getBytes(),
column.getBytes(),
value.getBytes(),
put);
System.out.printf("CheckAndPut Demo: ret: %b%n", ret);
MySQL [test]> select * from htable1$family where k = "testKey2";
+----------+--------+----------------+-----------+
| K | Q | T | V |
+----------+--------+----------------+-----------+
| testKey2 | column | -1715961408587 | value_new |
| testKey2 | column | -1715961035471 | putValue |
+----------+--------+----------------+-----------+
説明:
- 主キーが
testKey2、値がputValueのセルが変更され、値がvalue_newの新しいバージョンのセルが生成されます。
Check And Delete
機能説明:
- 指定された列を削除するために使用します。該当する列が存在し、削除が成功した場合は
trueを返し、そうでない場合はfalseを返します。
関数プロトタイプ:
- boolean checkAndDelete(byte[] row, byte[] family, byte[] qualifier, byte[] value, Delete delete)
パラメータ:
row:ターゲット行のキー。family:テーブル作成時に指定したターゲットのカラムファミリー。qualifier:ターゲット列名。value:ターゲット列の値。delete:削除する列。
例:
String key = "testKey2";
String family = "family";
String column = "column";
String value = "value_new";
Delete delete = new Delete(key.getBytes());
delete.deleteColumn(family.getBytes(), column.getBytes());
boolean ret = hTable.checkAndDelete(
key.getBytes(),
family.getBytes(),
column.getBytes(),
value.getBytes(),
delete);
System.out.printf("CheckAndDelete Demo: ret: %b%n", ret);
MySQL [test]> select * from htable1$family where k = "testKey2";
+----------+--------+----------------+----------+
| K | Q | T | V |
+----------+--------+----------------+----------+
| testKey2 | column | -1715961035471 | putValue |
+----------+--------+----------------+----------+
説明:
- 主キーが
testKey2、値がvalue_newのセルは削除され、データベースにはこのセルは存在しません。
Get Configuration
機能説明:
- 操作インスタンスのconfigハンドルを返します。これを使用して操作属性を変更できます。
関数プロトタイプ:
- Configuration getConfiguration()
パラメータ:
- なし。
例:
hTable.getConfiguration().set("rpc.execute.timeout", "1500");