すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB for HBase:SQL を使用して HBase テーブルにアクセスする

最終更新日:Nov 10, 2025

このトピックでは、SQL ステートメントを使用して HBase テーブルにアクセスする方法について説明します。

前提条件

LindormTable のバージョンが 2.6.4 以降であること。 LindormTable のバージョンを表示またはアップグレードする方法の詳細については、「LindormTable のリリースノート」および「Lindorm インスタンスのマイナーエンジンバージョンをアップグレードする」をご参照ください。

背景情報

LindormTable を使用すると、HBase Shell または ApsaraDB for HBase API for Java を使用して作成されたテーブルに直接アクセスできます。 HBase テーブルはスキーマレス テーブルです。 HBase テーブルの列は、バイト配列を表す VARBINARY データ型の動的列です。 動的列の詳細については、「動的列」をご参照ください。 ApsaraDB for HBase は列マッピング機能を提供し、HBase テーブルの HBase 互換データ型をサポートしています。 これにより、ApsaraDB for HBase API for Java に基づいて記述された列に Lindorm SQL ステートメントを使用し、幅広いデータ型とセカンダリ インデックスを使用できます。

構文

Lindorm SQL では、HBase テーブルのカスタム列ファミリの修飾子にマッピングを追加できます。 これにより、後続のクエリに SQL ステートメントを使用できます。

次の構文を使用して、マッピングを追加および削除できます。

dynamic_column_mapping_statement   := ALTER TABLE table_name MAP DYNAMIC COLUMN
                                      qualifer_definition hbase_type;
dynamic_column_unmapping_statement := ALTER TABLE table_name UNMAP DYNAMIC COLUMN
                                      qualifer_definition_list;
qualifer_definition_list           := qualifer_definition
                                      (',' qualifer_definition)*
qualifer_definition                := [ family_name ':' ] qualifier_name
hbase_type                         := HLONG | HINTEGER | HSHORT | HFLOAT |
                                      HDOUBLE | HSTRING | HBOOLEAN

次の表に、hbase_type パラメーターで指定できるマッピング データ型を示します。

データ型

Java データ型

説明

HLONG

java.lang.Long

Bytes.toBytes(long) 関数を使用して、データが HBase テーブルの列に書き込まれます。

HINTEGER

java.lang.Integer

Bytes.toBytes(int) 関数を使用して、データが HBase テーブルの列に書き込まれます。

HSHORT

java.lang.Short

Bytes.toBytes(short) 関数を使用して、データが HBase テーブルの列に書き込まれます。

HFLOAT

java.lang.Float

Bytes.toBytes(float) 関数を使用して、データが HBase テーブルの列に書き込まれます。

HDOUBLE

java.lang.Double

Bytes.toBytes(double) 関数を使用して、データが HBase テーブルの列に書き込まれます。

HSTRING

java.lang.String

Bytes.toBytes(String) 関数を使用して、データが HBase テーブルの列に書き込まれます。

HBOOLEAN

java.lang.Boolean

Bytes.toBytes(boolean) 関数を使用して、データが HBase テーブルの列に書き込まれます。

説明
  • バージョン 2.5.1 以降の LindormTable は、行キーのマッピングをサポートしています。 行キーのマッピング方法については、修飾子のマッピング方法を参照してください。 行キーをマッピングする場合は、行キーをバッククォート(` `)で囲んでください。

  • 他のプログラミング言語では、org.apache.hadoop.hbase.util.Bytes Java クラスの toBytes メソッドを使用して、データをエンコードおよび書き込むことができます。

  • Java では、Bytes.toBytes(String) 関数はデータのエンコードに UTF-8 を使用します。 他のプログラミング言語では、toBytes メソッドを使用して文字列をバイトに変換する場合にも、UTF-8 がデータのエンコードに使用されます。

データの準備

このトピックでは、ApsaraDB for HBase API for Java を使用してサンプルの HBase テーブルを作成し、テーブルにデータを書き込みます。 詳細については、「ApsaraDB for HBase API for Java を使用してアプリケーションを開発する」をご参照ください。

説明

他の方法を使用して HBase テーブルを作成し、テーブルにデータを書き込む方法の詳細については、「Lindorm Shell を使用して LindormTable に接続する」をご参照ください。

// dt という名前のサンプル HBase テーブルを作成し、列ファミリ名として f1 を指定します。
try (Admin admin = connection.getAdmin()) {
            Table table = connection.getTable(TableName.valueOf("dt"));
            HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("dt"));
            htd.addFamily(new HColumnDescriptor(Bytes.toBytes("f1")));
            admin.createTable(htd);
            }
    
// テーブルにデータを書き込みます。
try (Table table = connection.getTable(TableName.valueOf("dt"))) {
    byte[] rowkey = Bytes.toBytes("row1");
    byte[] family = Bytes.toBytes("f1");
    Put put = new Put(rowkey);
    // STRING 型のデータを書き込み、列名として name を指定します。
    String name = "Some one";
    put.addColumn(family, Bytes.toBytes("name"), Bytes.toBytes(name));
    // INT 型のデータを書き込み、列名として age を指定します。
    int age = 25;
    put.addColumn(family, Bytes.toBytes("age"), Bytes.toBytes(age));
    // LONG 型のデータを書き込み、列名として time を指定します。
    long timestamp = 1656675491000L;
    put.addColumn(family, Bytes.toBytes("time"), Bytes.toBytes(timestamp));
    // SHORT 型のデータを書き込み、列名として buycode を指定します。
    short buycode = 123;
    put.addColumn(family, Bytes.toBytes("buycode"), Bytes.toBytes(buycode));
    // FLOAT 型のデータを書き込み、列名として price を指定します。
    float price = 12.3f;
    put.addColumn(family, Bytes.toBytes("price"), Bytes.toBytes(price));
    // DOUBLE 型のデータを書き込み、列名として price2 を指定します。
    double price2 = 12.33333;
    put.addColumn(family, Bytes.toBytes("price2"), Bytes.toBytes(price2));
    // BOOLEAN 型のデータを書き込み、列名として isMale を指定します。
    boolean isMale = true;
    put.addColumn(family, Bytes.toBytes("isMale"), Bytes.toBytes(isMale));

    // すべての型のデータに null 値を書き込みます。
    //put.addColumn(family, qualifier, null);

    table.put(put);
    }

手順

次の例は、dt という名前の HBase テーブルを作成し、SQL ステートメントを使用して HBase テーブルにアクセスする方法を示しています。

  1. Lindorm-cli を使用して、LindormTable に接続して使用します。 LindormTable に接続して使用する方法の詳細については、「Lindorm-cli を使用して LindormTable に接続して使用する」をご参照ください。

    説明

    ApsaraDB for HBase パフォーマンス強化版で SQL ステートメントを使用して HBase テーブルにアクセスする場合は、Java の API URL の形式を jdbc:lindorm:table:url=http://Java の API URL に変更し、ポート番号を 30020 から 30060 に変更する必要があります。 Java の API URL は、ApsaraDB for HBase コンソールで取得します。

    たとえば、ApsaraDB for HBase コンソールで ld-bp1ietqp4fby3****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30020 URL を取得した場合は、URL を jdbc:lindorm:table:url=http://ld-bp1ietqp4fby3****-proxy-hbaseue.hbaseue.rds.aliyuncs.com:30060 に変更します。

  2. ALTER TABLE ステートメントを実行して、dt テーブルの列に書き込まれたデータのマッピングを追加します。

    ALTER TABLE dt MAP DYNAMIC COLUMN `ROW` HSTRING, f1:name HSTRING, f1:age HINTEGER, f1:time HLONG, f1:buycode HSHORT, f1:price HFLOAT, f1:price2 HDOUBLE, f1:isMale HBOOLEAN;
    説明
    • 列マッピングの追加とは、列にデータを書き込むかどうかに関係なく、列のデータ型を指定することを指します。

    • システムは、スキーマに基づいてバイトを元のデータに戻します。 Lindorm SQL ステートメントでは、SQL データ型にマッピングされた正しいデータ型を指定する必要があります。

    次の例では、f:age2 という名前の列のデータ型として HINTEGER を指定すると、システムは Bytes.toInt() 関数を呼び出して誤ったデータを取得する可能性があります。

    int age = 25;
    byte[] ageValue = Bytes.toBytes(age);
    put.addColumn(Bytes.toBytes("f"), Bytes.toBytes("age"), ageValue);// f:age という名前の列のデータ型は INT で、Lindorm SQL ステートメントの HINTEGER データ型にマッピングされます。
    String age2 = "25";
    byte[] age2Value = Bytes.toBytes(age2);
    put.addColumn(Bytes.toBytes("f"), Bytes.toBytes("age2"), age2Value);// f:age2 という名前の列のデータ型は STRING で、Lindorm SQL ステートメントの HSTRING データ型にマッピングされます。
  3. DESCRIBE ステートメントを実行して、現在のスキーマのマッピングを表示します。

    DESCRIBE dt;
    説明

    DESCRIBE ステートメントの構文の詳細については、「DESCRIBE/SHOW/USE」をご参照ください。

  4. 次の SQL ステートメントを使用して、dt テーブルのデータをクエリします。

    SELECT * FROM dt LIMIT 1;
    SELECT * FROM dt WHERE f1:isMale=true LIMIT 1;
    SELECT * FROM dt WHERE f1:name='Some one' LIMIT 1;
    SELECT * FROM dt WHERE f1:time>1656675490000 and f1:time<1656675492000 LIMIT 1;
  5. オプション。 セカンダリ インデックスを作成します。

    セカンダリ インデックスは、ストレージ容量を犠牲にしてデータのクエリ時間を短縮するために使用されます。 セカンダリ インデックスを使用すると、主キー以外の列に基づいてデータをクエリできます。 これにより、クエリの効率は向上しますが、より多くのストレージ容量が必要になります。 セカンダリ インデックスの構文制限の詳細については、「CREATE INDEX」および「セカンダリ インデックス」をご参照ください。

    1. dt という名前のプライマリ テーブルの属性を変更します。

      ALTER TABLE dt SET 'MUTABILITY' = 'MUTABLE_LATEST';
      説明

      カスタム タイムスタンプを使用する場合は、プライマリ テーブルの属性を MUTABLE_ALL に設定する必要があります。

    2. テーブルのセカンダリ インデックスを作成します。

      CREATE INDEX idx ON dt(f1:age) WITH (INDEX_COVERED_TYPE ='COVERED_DYNAMIC_COLUMNS');
    3. オプション。 セカンダリ インデックスの作成時に async パラメーターを指定し、LindormTable のバージョンが 2.6.3 より前 の場合は、プライマリ テーブルからインデックス テーブルに履歴データを構築します。 その後、セカンダリ インデックスを使用して履歴データをクエリできます。 セカンダリ インデックスの作成時に async パラメーターを指定しない場合は、この手順をスキップします。 その後、セカンダリ インデックスを使用して履歴データをクエリできます。 セカンダリ インデックスの作成時に async パラメーターを指定しない場合は、この手順をスキップします。

      BUILD INDEX idx ON dt;
    4. インデックスを表示します。

      SHOW INDEX FROM dt;

      サンプル結果:

      +---------------+----------- -+-------------+--------------+------------------+---------------+-----------------+----------------+-------------+
      | TABLE_SCHEMA  | DATA_TABLE  | INDEX_NAME  | INDEX_STATE  |  INDEX_PROGRESS  |  INDEX_TYPE   |  INDEX_COVERED  |  INDEX_COLUMN  |  INDEX_TTL  |
      +---------------+-------------+-------------+--------------+------------------+---------------+-----------------+----------------+-------------+
      | default       | dt          | idx         | ACTIVE       | 100%             | SECONDARY     |  TRUE           |  f1:age,ROW    |             |
      +---------------+-------------+-------------+--------------+------------------+---------------+-----------------+----------------+-------------+
      説明
      • 返された結果の INDEX_STATE の値が Active の場合、インデックスは構築されています。

      • 返された結果の INDEX_PROGRESS の値は、インデックス構築の進捗状況を示します。

    5. オプション。 EXPLAIN ステートメントを実行して、実行プランを表示します。 セカンダリ インデックスがヒットしたかどうかを確認できます。

      EXPLAIN SELECT * FROM dt WHERE f1:age=23 LIMIT 1;
  6. オプション。 検索インデックスを作成します。

    1. 検索インデックスを作成します。

      CREATE INDEX search_idx USING SEARCH ON dt(f1:age,f1:name);
      説明

      SQL ステートメントを実行して HBase テーブルの検索インデックスを作成する場合は、検索インデックスの列に関する次の制限事項に注意してください。

      • 検索インデックスのすべての列は、テーブルに作成された列マッピングで定義する必要があります。

      • 検索インデックスの列でサポートされるデータ型は、マッピングで指定できるデータ型と同じである必要があります。 詳細については、「マッピングのデータ型」をご参照ください。

      • HBase テーブルと検索インデックスの間で構成された列マッピングは削除できません。 削除すると、誤ったクエリ結果が返されます。

      • カスタム タイムスタンプを使用して HBase テーブルにデータを書き込み、検索インデックスを作成する必要がある場合は、テーブルの MUTABILITY 属性を MUTABLE_ALL に設定する必要があります。

    2. インデックスが作成されているかどうかを確認します。

      SHOW INDEX FROM dt;

      サンプル結果:

      +--------------+------------+------------+-------------+----------------+------------+---------------+----------------+-----------+-------------------+
      | TABLE_SCHEMA | DATA_TABLE | INDEX_NAME | INDEX_STATE | INDEX_PROGRESS | INDEX_TYPE | INDEX_COVERED |  INDEX_COLUMN  | INDEX_TTL | INDEX_DESCRIPTION |
      +--------------+------------+------------+-------------+----------------+------------+---------------+----------------+-----------+-------------------+
      | default      | dt         | idx        | ACTIVE      | DONE           | SECONDARY  | DYNAMIC       | f1:age,ROW     |           |                   |
      | default      | dt         | search_idx | BUILDING    | N/A            | SEARCH     | NA            | f1:age,f1:name | 0         |                   |
      +--------------+------------+------------+-------------+----------------+------------+---------------+----------------+-----------+-------------------+
  7. オプション。 1 つ以上の列マッピングを削除します。

    • 1 つの列マッピングを削除します。 サンプルコード:

      ALTER TABLE dt UNMAP DYNAMIC COLUMN f1:isMale;
    • 複数の列マッピングを削除します。 サンプルコード:

      ALTER TABLE dt UNMAP DYNAMIC COLUMN f1:price2, f1:price2;