ネストされたエンティティは、HBase の公式機能ではありません。これは、一部の人々が 1 つの使用パターンについて話している方法にすぎません。このパターンでは、HBase の「列」が実際には単なる大きなマップ (キーと値のペアの集まり) であるという事実を利用して、「行」ごとに 1 つの列を追加することにより、行内のカーディナリティの次元をモデル化できるようにします。ネストされたエンティティ。
スキーマに関しては、テーブル自体に対して多くのことを行う必要はありません。HBase でテーブルを作成するときは、(hbase シェルで) 次のように、名前と列ファミリー (および関連するプロパティ) を指定するだけです。
hbase:001:0> create 'UserWithBooks', 'cf1'
次に、列ごとに何を入れるかはあなた次第です。次のような値を挿入できます。
hbase:002:0> put 'UsersWithBooks', 'userid1234', 'cf1:username', 'my username'
hbase:003:0> put 'UsersWithBooks', 'userid1234', 'cf1:ssn', 'my ssn'
hbase:004:0> put 'UsersWithBooks', 'userid1234', 'cf1:book_id_12345', '<isbn>12345</isbn><title>mary had a little lamb</title>'
hbase:005:0> put 'UsersWithBooks', 'userid1234', 'cf1:book_id_67890', '<isbn>67890</isbn><title>the importance of being earnest</title>'
列名は完全に自由であり、使用できる数に制限はありません (理由の範囲内で: 詳細については、HBase リファレンス ガイドを参照してください)。もちろん、これを行うには、値を出し入れするための独自の作業を行う必要があります (おそらく、これらのシェル コマンドで行うよりも洗練された方法で Java クライアントを使用することになるでしょう。説明のみを目的としています)。テーブル内の列の一部だけをキーで効率的にスキャンできますが (列の改ページ フィルターを使用)、セルの内容を取得して別の場所で解析する以外に、セルの内容を処理することはできません。
なぜこれを行うのですか?おそらく、1 つの親行に対してネストされたすべての行の原子性が必要な場合にのみ使用できます。あまり一般的ではありませんが、おそらく最善の策は、それらを別々のテーブルとしてモデル化することから始めて、トレードオフを本当に理解している場合にのみ、このアプローチに移行することです。