データウェアハウス:毎日のスナップショットを照会するにはどうすればよいですか?


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

これは1日1テーブル分です。1か月のカテゴリごとの1日の平均投稿数を数えたい場合は次のようにします。

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

別の例、1か月に公開された投稿

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がある場合、day1にあり、day5にないすべての投稿は、2、3、4日にあったようにカウントされます。day1およびday5であるすべての投稿は、月の毎日(=次のスナップショットまで)であるかのようにカウントされます。

したがって、1日あたりの投稿の平均数が6か月以上の場合、スナップショットが1つしかない場合、そのスナップショットに30の重みを割り当てます。

したがって、6か月以上前の範囲で1か月に公開された平均投稿は次のようになります。

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; 

極端な解決策として、将来のユーザー(マーケティング担当者など)がこのようなクエリを実行できるようにするメタ言語を実装するという考えを検討しています。

メタ言語なしでこれをドリルで達成する方法があると思いますか?私は再帰的なUDFを使用してこれを行いますが、クエリを返すことができません。

すべてのスナップショットは250GBと大きいので、これらのデータセットを他の外部データと比較できるようにしたいと思います(これらのデータセットのスキームを事前に知りません)。

Apache Drillに適したソリューションはありますか?または、この問題の別の解決策はありますか?

また、この問題に関するメタ言語や論文も歓迎します。

編集: トランザクションデータはありません。時間とともに変化するデータがあり、追加または削除できます。このため、毎日のスナップショットが必要です。また、実行されるクエリが事前にわからないため、どのような種類の集計が行われるかわかりません。また、すべての行には約100列があり、スナップショット(Mysqlテーブル)ごとに250GBあります。また、可能なすべての日に、すべての行のこのデータを全文検索する必要があります。

検索の例としては、「sometopicに関する投稿はいくつありましたか」などがあります。そのため、sometopicキーワードのすべての投稿を検索する必要があります。すべてのスナップショットに同じ行がある場合とない場合があります。また、2つのスナップショットが同じ投稿を持っている可能性がありますが、少し変更されています。


データにまともな構造があるようです。スキームフリーのソリューションを探している理由は何ですか?スキームによって私は仮定していますtable definitions/structures
vmachan

データセットをロードする前に新しいテーブルを定義したくないので。この問題を処理できる解決策はあるが、事前にテーブルを定義する必要がある場合は、とにかくそれを選択します。
フェデリコポンジ

250GBの毎日のスナップショット?これらの要件については?どうやって?
トムV-16年

なぜ毎日のスナップショット?1日に250 GBのうちどれだけ変化しますか?緩やかに変化するディメンションアプローチの何が問題になっていますか?
dnoeth

この問題をデータウェアハウジングの観点からではなく、クエリ方法やビッグデータの観点から考えてください。データベースの毎日のスナップショットが異なるので、それらを効果的にクエリする方法を教えてください。
フェデリコポンジ

回答:


2

箱から出して考えてみましょう。「スナップショット」を作成する代わりに、「ログ」を作成しましょう。あなたが現在持っているのは物事の「現在の」状態です。「ログ」を追加すると「履歴」が提供され、そこから「失われた」情報を得ることができます。

ログを実装する1つの方法は、テーブルをTRIGGERオンINSERTまたはオフにしUPDATE、トリガーにログファイルへの書き込みを行わせることです。このログはアドホッククエリには適していません。そのため、その日の変更(投稿数の正味の増加(または減少)など)を要約する夜間の仕事(またはおそらく1時間ごと)を用意してください。「day2」情報と「先月」の情報は、この要約テーブルから非常に迅速に取得できます。または、状態が毎日どうなっているかを宣言する第2レベルの要約。UNION必要になるかどうか疑問です。「スナップショット」は関係しません。


1
私は毎日のスナップショットをクエリする方法を尋ねました、あなたはただ最適化について話しているだけです-私は後でそれを考えます。ありがとう
フェデリコポンツィ

1
スナップショットは(私の意見では)処理するのが難しいため、難しい解決策に悩まされるのではなく、「実際の」問題を解決する方法を提示しようとしていました。また、要約により、大幅に高速なクエリが可能になります。
リックジェームズ

2

そこで私が探していたのは、データウェアハウスに関連する新しいタイプのシステム、Data Lake Systemです。

あなたはウィキペディアでもっと学ぶことができます:

データレイクは、システム内にデータを格納する方法であり、データをバリアントスキーマと構造フォーム(通常はオブジェクトblobまたはファイル)で同じ場所に配置できるようにします。HadoopとAWS S3プラットフォームを使用して、データレイクリポジトリを構築できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.