4

次の要件の HBase テーブルをモデル化するのが難しいと感じています。

店舗の詳細(Pizza Hut)を保存するテーブル「Store」があります。

トランザクションの概要(合計トランザクション金額など...)を含む「注文」テーブルがあります。

トランザクションで注文されたすべてのアイテムが保存される別のテーブル「Order_Item」があります(これには、アイテムID、アイテム名、アイテム数、税などが含まれます..)

  1. 要件は、特定のストアからの特定の注文アイテムによる総収入を時間範囲で計算することです。

例 : 日付範囲 - 先週、店舗 - ピザ A、アイテム - A、総収入 - 120$

  1. もう 1 つの要件は、特定の時間範囲を指定して、店舗からの特定の注文アイテムによる総収入のパーセンテージを計算することです。

例 : 日付範囲 - 先週、店舗 - ピザ A、商品 - A、% 収入 - 23%

hbase テーブルをどのようにモデル化するかで本当に行き詰まっており、締め切りに緊張しています。

これについて誰かが私を助けてください。

4

2 に答える 2

4

HBase では、通常のクエリに合わせてテーブルを設計する必要があります。任意の「理にかなっている」に基づいてテーブルを設計すると、パフォーマンスが低下します。

主な要件は、日付範囲/店舗/アイテムでクエリを実行することなので、これをキーにする必要があります。これがキーであれば、クエリは高速になります。

キーを日付範囲 + ストア + アイテムと区切り文字の連結にすることをお勧めします。

20110103-PIZZAHUT-MEATLOVERS
20110103-PIZZAHUT-VEGETABLE
20110104-PIZZAHUT-MEATLOVERS
20110105-DOMINOS-HAWAIIAN

次に、販売された各アイテムを最初の列ファミリーに (ID:profit) として格納します。ここでの ID は、一意のタイムスタンプ、UUID、レシート ID などです。

最初のクエリでは、DATE-STORE-ITEM でキー ルックアップを実行し、取得したすべての値を合計するだけです。

20110107-PIZZAHUT-!2 番目のクエリでは、 からまでの範囲スキャンを実行し20110206-PIZZAHUT-~ます。探しているアイテムとそうでないすべてのアイテムを合計します。最後にパーセンテージを計算します。

于 2012-04-19T10:52:28.383 に答える
4

Orangeoctopus が提案するアプローチは、1 日、1 店舗、1 アイテムにつき 1 つの行を格納し、トランザクションごとに 1 つの列を格納することです。それは良いことです。もう 1 つの方法は、同じキー フィールドとキーの一部として一意の ID を使用して、各トランザクションを独自の行に格納することです。次に、1 つの列ファミリに 1 つの列があり、金額が表示されます。

20110103-PIZZAHUT-MEATLOVERS-857283394
20110103-PIZZAHUT-MEATLOVERS-857283395
20110103-PIZZAHUT-MEATLOVERS-857283396
20110103-PIZZAHUT-VEGETABLE-859238494
20110103-PIZZAHUT-VEGETABLE-859238494

この設計にも同じロジックが適用されます。クエリは両方とも特定の日付範囲をスキャンし、必要なデータを取得します (単一のストアまたはストア製品の組み合わせに制限する場合は、それを行うことができます)。唯一の違いは、日付/店舗/アイテムの組み合わせごとに 1 つの行に多数の列を配置するのではなく、一連の行をスキャンしていることです。

これらは、HBase の 2 つの主要な設計手法です。行としてのエンティティ、または親エンティティ行内にネストされた列としてのエンティティです。後者の利点は、行内のすべての列をトランザクションで更新できることです。欠点は、それを取得するためのコードがもう少し複雑であることです (また、同時実行性が高い場合は、そのトランザクション性にわずかな代償を払います)。

参考までに、この行キーを使用して効率的に実行できないのは、行キーの一部を順番に使用できないクエリです。したがって、たとえば、ピザハットの売上が常に必要な場合は、サーバー側でテーブルのすべての行をスキャンする必要があります (おそらく、このテーブルに大量のデータがあるため、これは望ましくありません。そうでなければ、HBase を使用していないでしょう ... :)

于 2012-04-19T13:52:53.477 に答える