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


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

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

로그를 구현하는 한 가지 방법 은 테이블에 테이블 TRIGGERINSERT두거나 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.