2012-11-05 9 views
5

아주 간단한 데이터베이스에서 파이썬의 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

명확한 설명 : 조인은 최종 사용자에게 숨겨져 있으며 논리적 - 물리적 매핑의 일부이며 논리적 모델에 지정되어 있습니다. 또한 Cubes에는 MySQL뿐만 아니라 SQLAlchemy에서 지원하는 모든 백엔드가 포함 된 많은 관계형 데이터베이스 백엔드가 있습니다. 여기에는 PostgreSQL, Oracle, SQLite 등이 포함됩니다. – Stiivi

답변

14

먼저 모델을 조금 수정합시다. 스키마에서 차원 당 특성이 더 많습니다 (ID와 이름). 앞으로 더 자세한 정보를 얻게 될 수도 있습니다. 속성을 목록으로 지정하여 추가 할 수 있습니다 : "attriubtes": ["id", "name"]. 치수가 id_product 키가 아닌 엔티티 product으로 지정됩니다. id_product 키는 name이거나 미래에는 아마도 categoryproduct 차원의 속성 일뿐입니다. 차원은 분석가의 관점을 반영합니다.

당분간은 날짜가 특별한 차원이어야하며 여기서 날짜를 단일 값 키로 간주해야합니다 (예 : 1 년). 여기서 복잡한 작업이 아닌 것이 좋습니다.

"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을 확인하십시오. 구입 한 제품 당 count의 구매 상품이 없으므로 priceproduct과 같습니다.

{ 
    "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 명령을 사용하여 파이썬 코드를 작성하지 않고 모델을 시도 할 수 있습니다 : 여기

해당 모델에 업데이트 된 모델이다.이를 위해 당신은 slicer.ini configuration file이 필요합니다 [workspace]에서

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

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

[model] 
path: model.json 

변경 url를 데이터베이스를 가리 키와 모델 파일을 가리 키도록 [model]path을 변경할 수 있습니다. 지금 당신은 시도 할 수 있습니다 :

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

또한 드릴 다운을 시도 : 당신이 더 도움이 필요하면

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

, 그냥 내가 큐브 저자 해요 알려주세요.

+0

고마워, 훌륭한 연습! – user1491915

+0

"당분간 date가 특별한 차원이어야한다는 사실을 무시합니다." 더 많은 정보를 원하고 SQL 데이터 저장소를 사용하고 싶다면 해당 필드까지 날짜를 파싱하는 트릭이 있습니다. https://pythonhosted.org/cubes/backends/sql.html#date-data-type – DomQ

+0

필드 이름 "id"와 "name"은 특별한 의미가 있습니까? –

관련 문제