時系列ではないデータベースのスナップショットがいくつかあります。例えば:
スナップショット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