데이터웨어 하우스 : 일일 스냅 샷을 어떻게 쿼리 할 수 ​​있습니까?


9

시계열이 아닌 데이터베이스의 스냅 샷이 있습니다. 예를 들면 다음과 같습니다.

  • 스냅 샷 1 일 :

    +----+---------------+------------+------------+        
    | ID |     Title     |  Category  |    Date    |
    +----+---------------+------------+------------+
    | 1  | My First Post | helloworld | 2015-01-01 |
    +----+---------------+------------+------------+
  • 스냅 샷 2 일 (오늘 새로운 게시물이 추가됨) :

    +----+----------------+------------+------------+        
    | ID |      Title     |  Category  |    Date    |
    +----+----------------+------------+------------+
    | 1  | My first post  | helloworld | 2015-01-01 |
    | 2  | My second post | other      | 2015-01-02 |
    +----+----------------+------------+------------+
  • 스냅 샷 3 일 (포스트 2는 오늘 제거됨) :

    +----+---------------+------------+------------+        
    | ID |     Title     |  Category  |    Date    |
    +----+---------------+------------+------------+
    | 1  | My First Post | helloworld | 2015-01-01 |
    +----+---------------+------------+------------+

따라서 일 사이에 테이블 행이 일정하지 않을 수 있습니다. 이제 다음과 같은 쿼리를 사용할 수 있어야합니다.

SELECT category, COUNT(*) from day1.My_table group by category

이것은 하루의 한 테이블입니다. 우리가 경우 한 달에 카테고리 게시물의 일일 평균을 계산하려면 우리는 그런 짓을한다 :

SELECT category, SUM(cnt) / 30 
from ( 
    SELECT category, COUNT(*) as cnt 
    from day1.My_table 
    group by category 
        UNION ALL SELECT category, COUNT(*) as cnt 
                  from day2.My_table 
                  group by category 
        UNION ALL ... 
        UNION ALL SELECT category, COUNT(*) as cnt 
                  from day30.My_table 
                  group by category
) group by category

또 다른 예 는 한 달에 게시 된 게시물 수입니다 .

SELECT COUNT(distinct id) 
from ( 
    SELECT id 
    from day1.My_table 
    UNION ALL ... 
    UNION ALL SELECT id 
              from day30.My_table
) 

기본적으로 무게를 고려해야합니다. day1.My_table 및 day5.My_table이 있으면 5 일이 아닌 1 일에있는 모든 게시물은 2,3,4 일에도 계산됩니다. day1과 day5 인 모든 게시물은 매월 매일있는 것처럼 계산됩니다 (= 다음 스냅 샷까지).

따라서 하루에 평균 = 6 개월의 평균 게시물 수를 고려하고 싶은 경우 스냅 샷이 하나만있는 경우 해당 스냅 샷에 가중치를 30으로 할당합니다.

따라서> = 6 개월 전 범위에 대해 한 달에 게시 된 평균 게시물은 다음과 같습니다.

SELECT category, SUM(cnt) / 30 
from ( 
    SELECT category, COUNT(*)*30 as cnt 
    from day1.My_table 
    group by category --- Note: I'm not considering the range defined from the user in this example.
) group by category;

의견에서도 언급했듯이 다음과 같은 쿼리를 수행해야합니다.

Select category, AVG(*) 
from [fromRange-toRange].MyTable; 

극단적 인 해결책을 위해, 나는 미래 사용자 (예 : marketng 사람들)가 이와 같은 쿼리를 수행 할 수 있도록 금속 언어를 구현하는 아이디어를 고려하고 있습니다.

메타 언어없이 Drill에서이를 수행 할 수있는 방법이 있다고 생각하십니까? 재귀 UDF를 사용 하여이 작업을 수행하지만 쿼리를 반환 할 수 없습니다.

모든 스냅 샷은 250GB가 커서이 데이터 세트를 다른 외부 데이터와 비교할 수 있기를 원합니다 (이러한 데이터 세트의 체계는 미리 알 수 없습니다).

Apache Drill에 적합한 솔루션이 있습니까? 아니면이 문제에 대한 또 다른 해결책이 있습니까?

또한이 문제에 관한 메타 언어 또는 논문도 높이 평가됩니다.

편집 : 거래 데이터가 없습니다. 시간이 지남에 따라 데이터를 추가하거나 제거 할 수 있습니다. 이러한 이유로 매일 스냅 샷이 필요합니다. 또한 수행 할 쿼리를 미리 알지 못하므로 어떤 유형의 집계를 수행해야하는지 알 수 없습니다. 또한 모든 행에는 약 100 개의 열이 있으며 스냅 샷당 250GB (Mysql 테이블)가 있습니다. 또한 가능한 한 매일 모든 행에서이 데이터에 대한 전체 텍스트 검색이 필요합니다.

검색의 예는 "어떤 주제에 대한 게시물이 몇 개입니까?" 따라서 일부 주제 키워드에 대한 모든 게시물을 검색해야합니다. 모든 스냅 샷의 행이 같거나 같지 않을 수 있습니다. 또한 두 개의 스냅 샷이 동일한 게시물을 가질 수 있지만 약간 수정되었습니다.


데이터에 알맞은 구조를 가지고있는 것 같습니다. 왜 체계가없는 솔루션을 찾는 특별한 이유가 있습니까? 계획대로 가정table definitions/structures
— vmachan

데이터 세트를로드하기 전에 새 테이블을 정의하고 싶지 않기 때문입니다. 물론이 문제를 해결할 수있는 솔루션이 있지만 미리 정의 해야하는 테이블이 필요한 경우 어쨌든 선택할 것입니다.
— Federico Ponzi

250GB의 일일 스냅 샷? 그러한 요구 사항이 있습니까? 어떻게?
— Tom V-topanswers.xyz

일일 스냅 샷이 필요한 이유 하루에 250GB가 얼마나 변경됩니까? 천천히 변화하는 치수 접근 방식의 문제점은 무엇입니까?
— dnoeth

이 문제를 데이터웨어 하우징과 관련하여 생각하지 말고 쿼리 및 / 또는 빅 데이터 방법에 대해서는 생각하지 마십시오. 데이터베이스의 일일 스냅 샷이 다르므로 효과적으로 쿼리하는 방법을 원합니다.
— Federico Ponzi

답변:


2

상자 밖으로 생각하자. "스냅 샷"을 갖는 대신 "로그"를 보자. 현재 가지고있는 것은 "현재"상태입니다. "로그"를 추가하면 "기록"을 제공 할 수 있으며, 여기서 "손실"정보를 얻을 수 있습니다.

로그를 구현하는 한 가지 방법 은 테이블에 테이블 TRIGGER을 INSERT두거나 UPDATE트리거를 로그 파일에 쓰도록하는 것입니다. 이 로그는 임시 쿼리에 적합하지 않으므로 게시물 수의 순 이득 (또는 손실) 등 하루의 변경 사항을 요약하는 야간 작업 (또는 시간별)이 있습니다. "day2"정보 및 "지난 달"정보는이 요약표에서 매우 빠르게 도출 될 수 있습니다. 또는 상태가 매일 무엇인지 선언하는 두 번째 수준의 요약입니다. UNION필요한지 의심 합니다. "스냅 샷"은 관련되지 않습니다.


1
매일 스냅 샷을 쿼리하는 방법에 대해 물었습니다. 최적화에 대해 이야기하고 있습니다. 나중에 생각하겠습니다. 감사합니다
— 페데리코 폰지

1
스냅 샷은 다루기가 어렵 기 때문에 어려운 해결책에 얽매이지 않고 '실제'문제를 해결하는 방법을 제시하려고했습니다. 또한 요약하면 훨씬 빠른 쿼리가 가능합니다.
— Rick James

2

제가 찾던 것은 Datawarehousing : Data Lake System과 관련된 새로운 유형의 시스템입니다.

Wikipedia에 대해 더 자세히 배울 수 있습니다 .

데이터 레이크는 시스템 내에 데이터를 저장하는 방법으로 변형 스키마와 구조적 형태 (일반적으로 객체 블롭 또는 파일)로 데이터를 쉽게 배치 할 수 있습니다. Hadoop 및 AWS S3 플랫폼을 사용하여 데이터 레이크 리포지토리를 구축 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.