7

非常に単純なデータベースでPython の Olap フレームワークキューブを使用しようとしていますが、テーブルの結合に問題があります。

私のスキーマは次のようになります。

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'
                }
            ]
        }
    ]
}

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

ありがとうございました

4

1 に答える 1

16

まず、モデルを少し修正しましょう。あなたのスキーマでは、ディメンションごとにより多くの属性があります: id と name です。将来、より詳細になる可能性があります。属性をリストとして指定することで、それらを追加できます: "attriubtes": ["id", "name"]. また、ディメンションはproductキーではなくエンティティとして名前が付けられていることに注意してくださいid_product。キーは、ディメンションid_productの単なる属性であり、現在または将来的には可能性があります。ディメンションは、アナリストの視点を反映しています。productnamecategory

当面は、日付が特別な次元であるべきだという事実を無視し、ここで物事を複雑にしないように、日付を年などの単一値キーと見なします。

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

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

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

スキーマは、従来のデータ ウェアハウス スキーマではなく、従来のトランザクション スキーマを反映しています。この場合、以前のように明示的にし、必要なすべてのマッピングについて言及する必要があります。ルールは次のとおりです。属性がファクト テーブル (論理ビュー) に属している場合、キーは のattributeようにのみpriceであり、テーブルの指定はありません。属性が などのディメンションに属している場合product.id、構文はdimension.attributeです。マッピング ディクショナリの値は、物理テーブルと物理列です。マッピングの詳細を参照してください。スキーマのマッピングは次のようになります。

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

スキーマが次の場合、マッピングを記述する必要はありません。

fact purchases
id | date | user_id | product_id | amount

dimension product
id | name | price

dimension user
id | name

この場合、すべてのディメンション属性がそれぞれのディメンション テーブルにあるため、結合のみが必要です。ファクト テーブルの に注意してamountください。この場合、count購入ごとに購入した製品がないため、 と同じにpriceなりproductます。

モデルの更新されたモデルは次のとおりです。

{
    "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"
                }
            ]
        }

    ]
}

コマンドを使用するだけで、Python コードを記述せずにモデルを試すことができますslicerslicer.ini そのためには、構成ファイルが必要になります。

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

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

[model]
path: model.json

データベースを指すように変更しurl、モデル ファイルを指すように変更します。今すぐ試すことができます:[workspace]path[model]

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

また、ドリルダウンしてみてください:

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

さらにサポートが必要な場合は、お知らせください。私は Cubes の作成者です。

于 2012-11-05T23:03:50.983 に答える