我有一些不是时间序列的数据库快照。例如:
快照第一天:
+----+---------------+------------+------------+ | 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关键字。每个快照可能有相同的行,也可能没有。另外,两个快照可能具有相同的帖子,但稍作修改。
table definitions/structures