準備
[クイックスタート] トピックを読み、最新バージョンの HBase Shell をダウンロードし、HBase Shell を構成します。
HBase テーブルと Search インデックス間のマッピングの作成
JavaScript Object Notation(JSON)ファイルを使用して、HBase テーブルと Search インデックス間のマッピングを作成できます。次の例は、設定例を示しています。
{
"sourceNamespace": "default",
"sourceTable": "testTable",
"targetIndexName": "democollection",
"indexType": "SOLR",
"rowkeyFormatterType": "STRING",
"fields": [
{
"source": "f:name",
"targetField": "name_s",
"type": "STRING"
},
{
"source": "f:age",
"targetField": "age_i",
"type": "INT"
}
]
}上記の例では、testTable テーブルのデータが democollection インデックスに同期されます。列ファミリーと列名がコロン(:)で区切られた f:name 列は、インデックスの name_s 列にマッピングされます。f:age 列は、インデックスの age_i 列にマッピングされます。次の表に、パラメーターと有効な値を示します。
| パラメーター | 説明 |
| sourceNamespace | HBase テーブルの名前空間。テーブルで使用可能な名前空間がない場合は、パラメーターを空のままにするか、値を default に設定します。 |
| sourceTable | 名前空間を含まない HBase テーブルの名前。 |
| targetIndexName | Search インデックスの名前。 |
| indexType | 値は SOLR に設定されます。 |
| rowkeyFormatterType | HBase テーブルの rowkey 形式。このパラメーターは、STRING または HEX に設定できます。詳細については、次のセクションを参照してください。 |
| fields | マッピングされる列と、Search インデックスの列のタイプ。値は JSON 配列です。複数のフィールドはコンマ(,)で区切ります。詳細については、次の例を参照してください。このパラメーターの詳細については、次のセクションを参照してください。 |
rowkeyFormatterType
rowkeyFormatterType は、HBase テーブルの rowkey がインデックスドキュメントの ID にどのようにマッピングされるかを示します。ID は文字列です。有効な値:
STRING: HBase テーブルの rowkey のデータ型がrow1order0001、12345などの STRING の場合は、この値を使用します。注:上記の例では、12345 は数値ではなく文字列です。この場合、Bytes.toString(byte[]) 関数を使用して、rowkey をインデックスドキュメントのIDに変換できます。Search インデックスで目的のドキュメントを見つけたら、Bytes.toBytes(String) 関数を使用して、インデックスドキュメントのIDを byte[] に変換できます。これは、HBase テーブルの元のデータをクエリするための rowkey として使用されます。HEX: HBase テーブルの rowkey のデータ型が STRING でない場合は、この値を使用します。たとえば、rowkey が 12345 などの数値、または文字列以外のデータ型を含む複数のフィールドの組み合わせである場合は、パラメーターを HEX に設定します。この場合、org.apache.commons.codec.binary.Hex パッケージの encodeAsString(byte[]) 関数を使用して、rowkey をインデックスドキュメントのIDに変換できます。Search インデックスで目的のドキュメントを見つけたら、Hex.decodeHex(String.toCharArray()) 関数を使用して、インデックスドキュメントの ID を byte[] に変換できます。これは、HBase テーブルの元のデータをクエリするための rowkey として使用されます。
注:bytes.tobytes(string) 関数を使用して Hbase テーブルにデータが書き込まれていない場合、データ型は STRING とは見なされません。rowkey を Hbase にインポートするには、このパラメーターを HEX に設定します。そうしないと、インデックス内のドキュメントの ID をバイトに戻すと、結果が元の Rowkey と異なる場合があります。
fields
次の表に、フィールドマッピングのパラメーターを示します。
| パラメーター | 説明 |
| source | HBase テーブルでマッピングされる列の名前。列ファミリーと修飾子の名前は、コロン(:)で区切ります。例:f:name。 |
| targetField | インデックスの列名。上記の例では、指定された列は 動的列 です(例:name_s、age_i)。動的列を使用する場合、列名を事前に定義する必要はありません。Search サービスは動的列を自動的に識別します。動的列の詳細については、「[構成セットの更新]」を参照してください。 |
| type | データ型が HBase テーブルに書き込まれるときの列のデータ型。このデータ型は、HBase テーブルのソース列のデータ型と同じである必要があります。有効な値は、INT、LONG、STRING、BOOLEAN、FLOAT、DOUBLE、SHORT、BIGDECIMAL です。値は大文字と小文字が区別されます。 |
データ型について
HBase は [データ型] の概念を使用しません。代わりに、データ型はバイトに変換されます。Bytes.toBytes(String/long/int/...) メソッドを呼び出して、STRING、LONG、INT など、すべてのタイプのデータをバイトに変換できます。このようにして、HBase テーブルの列にデータを格納できます。type パラメーターは、HBase テーブルの列にデータがどのように格納されるかを指定します。例:
int age = 25;
byte[] ageValue = Bytes.toBytes(age);
put.addColumn(Bytes.toBytes("f"), Bytes.toBytes("age"), ageValue);
String name = "25";
byte[] nameValue = Bytes.toBytes(name);
put.addColumn(Bytes.toBytes("f"), Bytes.toBytes("name"), nameValue);上記のコードでは、f:age 列は INT 型ですが、f:name 列は INT 型ではなく STRING 型です。データを Search インデックスに同期するには、type パラメーターを有効な値に設定する必要があります。システムは、指定された型に基づいてバイトを元のデータに戻し変換して、データを Search インデックスに同期します。上記の例では、INTf:name 列の型を INT に設定すると、システムは Bytes.toInt() メソッドを呼び出して、バイトを元のデータに戻し変換します。これにより、データが間違った型に変換されます。
targetField について
targetField パラメーターは、HBase テーブルのソース列からマッピングされる Search インデックスの変換先列を指定します。Search サービスには強力なスキーマがあります。したがって、各列に managed_schema 構成セットをプリセットする必要があります。スキーマの構成方法の詳細については、「[構成セットの更新]」を参照してください。Search サービスの dynamicField メソッドを使用することをお勧めします。このメソッドは、接尾辞に基づいて列の型を自動的に識別します。たとえば、name_s は、インデックスの列の型が STRING であることを示します。
HBase テーブルのソース列の型は、インデックスの列のデータ型と一致する必要はありません。たとえば、ソース列 f:age の型を STRING に設定し、インデックスの targetField パラメーターを age_i に設定して、列の型が INT であることを指定できます。ソース列がインデックスに同期されると、Search サービスはデータ型を STRING から INT に自動的に変換します。数値に変換できない STRING 型のデータが f:age 列に書き込まれている場合、列がインデックスに同期されるときにエラーが発生します。
スキーマの管理
マッピングのスキーマの変更
前のセクションで説明した JSON 形式のスキーマを schema.json という名前のファイルに格納できます。次に、HBase Shell で alter_external_index コマンドを実行して、HBase マッピングのスキーマを変更できます。schema.json ファイルは、HBase Shell の起動ディレクトリに配置する必要があります。ファイルを示す相対パスまたは絶対パスを指定することもできます。
hbase(main):006:0> alter_external_index 'HBase table name', 'schema.json'JSON ファイルを使用して、複数の列を追加、削除、または変更できます。fields パラメーターのすべてのマッピング列を削除して、HBase テーブルのすべてのマッピングを削除することもできます。例:
{
"sourceNamespace": "default",
"sourceTable": "testTable",
"targetIndexName": "democollection",
"indexType": "SOLR",
"rowkeyFormatterType": "STRING",
"fields": []
}既存のマッピングのスキーマに 1 つ以上の列を追加する場合は、add_external_index_field コマンドを実行できます。
hbase shell> add_external_index_field 'testTable', {FAMILY => 'f', QUALIFIER => 'money', TARGETFIELD => 'money_f', TYPE => 'FLOAT' }注:alter_external_index コマンドを実行してマッピングのスキーマが変更されたテーブルに対してのみ、add_external_index_field コマンドを実行して列を追加できます。マッピングのスキーマを変更するたびに、hbase テーブルは完全に変更されます。多数の列を変更する場合は、alter_external_index メソッドを実行して変更を完了することをお勧めします。
既存のマッピングのスキーマから 1 つ以上の列を削除する場合は、remove_external_index コマンドを実行します。
hbase shell> remove_external_index 'testTable', 'f:name', f:age'注:マッピングのスキーマを変更するたびに、hbase テーブルは完全に変更されます。多数の列を変更する場合は、alter_external_index メソッドを実行して変更を完了することをお勧めします。
マッピングの現在のスキーマの表示
HBase Shell で describe_external_index コマンドを実行して、現在のテーブルの JSON 形式のマッピングの完全なスキーマを取得します。
hbase(main):005:0> describe_external_index 'testTable'