Python多维数据集OLAP框架-如何使用连接?
我试图在一个非常简单的数据库上使用python的olap框架,但在连接表时遇到了一些问题 我的模式如下所示:Python多维数据集OLAP框架-如何使用连接?,python,database,olap,star-schema,Python,Database,Olap,Star Schema,我试图在一个非常简单的数据库上使用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'}
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'
}
]
}
]
}
现在我想显示所有的购买,显示产品的名称,用户名和购买日期。我似乎找不到办法来做这件事。文档有点少
谢谢首先,让我们稍微修理一下模型。在您的模式中,每个维度有更多的属性:id和name,将来可能会有更多的细节。您可以通过将属性指定为列表来添加它们:
“attriubtes”:[“id”,“name”]
。还请注意,维度命名为实体product
,而不是键id\u product
。键id\u product
只是产品
维度的一个属性,就像名称
或者将来可能是类别
一样。维度反映了分析师的观点
现在我们忽略了日期应该是一个特殊的维度,把日期看作是单一的价值键,例如一年,而不是把事情复杂化。
“尺寸”:[
{“name”:“user”,“attributes”:[“id”,“name”]},
{“名称”:“产品”、“属性”:[“id”、“名称”]},
{“名称”:“日期”}
],
因为我们更改了维度的名称,所以必须在多维数据集的维度列表中更改它们:
“多维数据集”:[
{
“名称”:“采购”,
“尺寸”:[“用户”、“产品”、“日期”],
...
您的架构反映了经典的事务性架构,而不是传统的数据仓库架构。在这种情况下,您必须像以前一样明确,并提及所有必要的映射。规则是:如果属性属于事实表(逻辑视图),则键仅为属性
,如价格
,无表规范。如果属性属于维度,如产品.id
,则语法为维度.attribute
。映射字典的值为物理表和物理列。请参阅。架构的映射如下所示:
“映射”:{
“价格”:“产品.价格”,
“product.id”:“products.id”,
“产品名称”:“产品名称”,
“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
在这种情况下,您只需要联接,因为所有维度属性都在各自的维度表中。请注意事实表中的金额
,在您的情况下,由于没有每次购买的购买产品的计数
,因此与产品
中的价格
相同
以下是您的模型的更新模型:
{
“尺寸”:[
{“name”:“user”,“attributes”:[“id”,“name”]},
{“名称”:“产品”、“属性”:[“id”、“名称”]},
{“名称”:“日期”}
],
“立方体”:[
{
“名称”:“采购”,
“尺寸”:[“用户”、“产品”、“日期”],
“措施”:[“价格”],
“映射”:{
“价格”:“产品.价格”,
“product.id”:“products.id”,
“产品名称”:“产品名称”,
“user.id”:“users.id”,
“user.name”:“users.name”
},
“加入”:[
{
“master”:“purchases.user\u id”,
“详细信息”:“users.id”
},
{
“主控”:“采购.产品\u id”,
“详细信息”:“products.id”
}
]
}
]
}
只需使用命令,您就可以在不编写任何Python代码的情况下尝试该模型。为此,您需要slicer.ini
:
将[workspace]
中的url
更改为指向您的数据库,并将[model]
中的路径更改为指向您的模型文件。现在您可以尝试:
curl "http://localhost:5000/aggregate"
此外,请尝试向下钻取:
curl "http://localhost:5000/aggregate?drilldown=product"
如果您需要任何进一步的帮助,请告诉我,我是多维数据集的作者。OLAP不是为进行联接而设计的。也许可以使用SQL数据库。@AaronWatters Python的多维数据集框架提供了此功能。它是一个MySQL后端。为了澄清:联接对最终用户是隐藏的,它们是逻辑到物理映射的一部分,并在逻辑模型。此外,Cubes有许多关系数据库后端,不仅仅是MySQL—所有由SQLAlchemy支持的后端。这些后端包括:PostgreSQL、Oracle、SQLite等。“目前,我们忽略了日期应该是一个特殊维度这一事实”如果你想知道更多关于这方面的信息,并且正在使用SQL数据存储:将日期解析为字段的诀窍将在下面的文章中解释:字段名“id”和“name”是否有特殊含义?链接https://pythonhosted.org/cubes/mapping.html
在“有关映射的更多信息”中返回404。可能它的意思是链接到此?
curl "http://localhost:5000/aggregate?drilldown=product"