我有一些不是时间序列的数据库快照。例如:
第一天快照:
+----+---------------+------------+------------+ | 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,那么第 1 天而不是第 5 天的每个帖子都将被计算为第 2、3、4 天的帖子。第 1 天和第 5 天的每个帖子都将被视为一个月中的每一天(= 直到下一个快照)。
因此,如果我想考虑平均每天 >=6 个月的帖子数,而我只有 1 个快照,我会为该快照分配 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;
对于一个极端的解决方案,我正在考虑实施一种元语言来让未来的用户(例如营销人员)进行这样的查询。
你认为有没有一种方法可以在没有元语言的情况下在 Drill 中实现这一点?我会使用递归 UDF 来执行此操作,但它们无法返回查询。
每个快照都是 250GB 大,我希望能够将这些数据集与其他外部数据进行比较(我事先不知道这些数据集的方案)。
有适合 Apache Drill 的解决方案吗?或者这个问题有其他解决方案吗?
此外,任何有关此问题的元语言或论文都值得赞赏。
编辑: 我们没有交易数据。我们有随时间变化的数据,可以添加或删除;因此,我们需要每天的快照。此外,我们事先不知道将要执行的查询,因此我们无法知道要进行哪种类型的聚合。此外,每行大约有 100 列,每个快照(Mysql 表)有 250GB。我们还需要在每一天、每一行对这些数据进行全文搜索。
搜索的一个例子可以是“有多少帖子是关于某个主题的?” 所以它必须在所有帖子中搜索 sometopic 关键字。每个快照可能有也可能没有相同的行。两个快照也可以有相同的帖子,但稍作修改。
让我们开箱即用。让我们有一个“日志”,而不是一个“快照”。您当前拥有的是事物的“当前”状态;添加“日志”将提供“历史”,从中可以得出“丢失”的信息。
实现日志的一种方法是使用表的
TRIGGER
onINSERT
或UPDATE
表,并让触发器写入日志文件。这个日志对于临时查询来说是不愉快的,所以有一个夜间工作(或者可能是每小时)来总结一天的变化——帖子数量的净收益(或损失)等。“day2”信息和然后可以很快地从这个汇总表中得出“上个月”的信息。或者也许是第二级总结,宣布每天的状态。我怀疑是否UNION
需要。不会涉及“快照”。所以我一直在寻找的是一种与数据仓库相关的新型系统:数据湖系统。
您可以在Wikipedia上了解更多信息: