2012-11-05 8 views
5

私はPythonのolapフレームワークcubesを非常に単純なデータベースで使用しようとしていますが、テーブルを結合する際に問題があります。Python Cubes OLAP Framework - どのようにジョインで作業するのですか?

Users table 
ID | name 

Products table 
ID | name | price 

Purchases table 
ID | user_id | product_id | date 

とキューブモデル::私のスキーマは、このようになります

{ 
    'dimensions': [ 
     {'name': 'user_id'}, 
     {'name': 'product_id'}, 
     {'name': 'date'}, 
    ], 
    'cubes': [ 
     { 
      'name': 'purchases', 
      'dimensions': ['user_id', 'product_id', 'date'], 
      'measures': ['price'] 
      'mappings': { 
       'purchases.user_id': 'users.id', 
       'purchases.product_id': 'products.id', 
       'purchases.price': 'products.price' 
      }, 
      'joins': [ 
       { 
        'master': 'purchases.user_id', 
        'detail': 'users.id' 
       }, 
       { 
        'master': 'purchases.product_id', 
        'detail': 'products.id' 
       } 
      ] 
     } 
    ] 
} 

今私は、製品名、ユーザ名と購入日を示す、すべての購入を表示したいと思います。私はこれを行う方法を見つけることができないようです。ドキュメントは少し不足しています。

ありがとうございました

+0

OLAPは結合を行うようには設計されていません。代わりにSQLデータベースを使用してください。 –

+2

@AaronWatters PythonのCubesフレームワークはこの機能を提供します。 MySQLのバックエンドです。 – user1491915

+0

明確にするために、ジョインはエンドユーザから隠されています。ジョインは論理と物理のマッピングの一部であり、論理モデルで指定されます。また、キューブにはMySQLだけでなく、SQLAlchemyでサポートされているバックエンドがたくさんあるリレーショナルデータベースバックエンドがあります。これには、PostgreSQL、Oracle、SQLiteなどが含まれます。 – Stiivi

答えて

14

最初にモデルを少し修正しましょう。あなたのスキーマには、ディメンションごとにIDと名前の属性が増えます。属性をリストとして指定することで追加できます:"attriubtes": ["id", "name"]。ディメンションの名前は、id_productというキーではなく、エンティティproductという名前になっています。キーid_productは、nameまたは今後の多分categoryのように、productディメンションの属性に過ぎません。ディメンションはアナリストの視点を反映しています。

当分の間、日付は特別な次元でなければならず、ここでは複雑にならないように、日付を単一値キー、たとえば年と見なすべきであるという事実は無視されます。

"dimensions": [ 
    {"name": "user", "attributes": ["id", "name"]}, 
    {"name": "product", "attributes": ["id", "name"]}, 
    {"name": "date"} 
], 

我々はディメンションの名前を変更したため、我々は、キューブのディメンション・リストにそれらを変更する必要があります。

"cubes": [ 
    { 
     "name": "purchases", 
     "dimensions": ["user", "product", "date"], 
     ... 

あなたのスキーマは、古典的なトランザクションのスキーマではなく、従来のデータ・ウェアハウス・スキーマを反映しています。この場合、明示的にする必要があります。必要なマッピングをすべて記述する必要があります。ルールは、アトリビュートがファクトテーブル(論理ビュー)に属している場合は、priceなどのテーブルの指定がない場合はattributeになります。属性が次元に属している場合(product.idなど)、構文はdimension.attributeです。マッピングディクショナリの値は、物理テーブルと物理カラムです。 more information about mappingsを参照してください。すべてのディメンションの属性がそれぞれにあるので、この場合は

fact purchases 
id | date | user_id | product_id | amount 

dimension product 
id | name | price 

dimension user 
id | name 

あなただけ参加する必要があります。あなたのスキーマがいた場合は、マッピングを記述する必要はないだろう

"mappings": { 
    "price": "products.price", 
    "product.id": "products.id", 
    "product.name": "products.name", 
    "user.id": "users.id", 
    "user.name": "users.name" 
} 

:スキーマのマッピングは次のようになりディメンション表ファクトテーブルのamountにご注意ください。をproductと同じにすると、ご購入の際にcount個の購入済み製品が存在しない場合があります。ここで

には、モデルの更新されたモデルです。

{ 
    "dimensions": [ 
     {"name": "user", "attributes": ["id", "name"]}, 
     {"name": "product", "attributes": ["id", "name"]}, 
     {"name": "date"} 
    ], 
    "cubes": [ 
     { 
      "name": "purchases", 
      "dimensions": ["user", "product", "date"], 
      "measures": ["price"], 
      "mappings": { 
       "price": "products.price", 
       "product.id": "products.id", 
       "product.name": "products.name", 
       "user.id": "users.id", 
       "user.name": "users.name" 
      }, 
      "joins": [ 
       { 
        "master": "purchases.user_id", 
        "detail": "users.id" 
       }, 
       { 
        "master": "purchases.product_id", 
        "detail": "products.id" 
       } 
      ] 
     } 

    ] 
} 

あなただけslicerコマンドを使用して、任意のPythonコードを記述せずにモデルを試すことができます。あなたのデータベースをポイントして、モデルファイルを指すように[model]pathを変更する[workspace]

[server] 
backend: sql 
port: 5000 
log_level: info 
prettyprint: yes 

[workspace] 
url: sqlite:///data.sqlite 

[model] 
path: model.json 

変更url:そのためにあなたはslicer.iniconfiguration fileが必要になります。今、あなたは試すことができます:

curl "http://localhost:5000/aggregate" 

また、ドリルダウンをしよう:あなたはそれ以上の助けが必要な場合は

curl "http://localhost:5000/aggregate?drilldown=product" 

、ちょうど私に知らせて、私はキューブの作者です。

+0

ありがとう、素晴らしいウォークスルー! – user1491915

+0

"当分の間、日付は特別な次元でなければならないという事実は無視されます。" 詳細について知りたい方、SQLデータストアを使用したい方は、そのフィールドまでの日付を解析するトリックはhttps://pythonhosted.org/cubes/backends/sql.html#date-data-type – DomQ

+0

フィールド名 "id"と "name"には特別な意味がありますか? –

関連する問題