数据仓库:如何查询每日快照?


9

我有一些不是时间序列的数据库快照。例如:

  • 快照第一天:

    +----+---------------+------------+------------+        
    | 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
vmachan

因为我不想在加载数据集之前定义新表。当然,如果有可以解决此问题的解决方案,但需要提前定义表,我还是会选择它。
Federico Ponzi

250GB的每日快照?有那些要求?怎么样?
汤姆五世-尝试topanswers.xyz

为什么要每日快照?每天250 GB中有多少更改?尺寸变化缓慢方法有什么问题?
dnoeth '16

请不要在数据仓库方面考虑此问题,而应在如何查询和/或大数据方面考虑。我的数据库每天都有不同的快照,我想一种有效地查询它们的方法。
Federico Ponzi'2

Answers:


2

让我们想一想。让我们有一个“日志”,而不是“快照”。您当前拥有的是事物的“当前”状态;添加“日志”将提供“历史记录”,从中可以导出“丢失”的信息。

实现日志的一种方法是在表TRIGGER上打开表INSERTUPDATE表,然后将触发器写入日志文件。该日志对于临时查询而言并不令人满意,因此需要做一份每晚(或每小时)的工作,以总结当天的更改-帖子数量的净增(或减)等。“ day2”信息和然后,可以从此汇总表中很快得出“上个月”的信息。或者,也许是第二级汇总,它声明了每天的状态。我怀疑是否UNION需要。不会涉及“快照”。


1
我问了如何查询每日快照,您只是在谈论一种优化-我稍后会想到。谢谢
Federico Ponzi

1
快照很难处理(我认为),因此我试图提出一种解决“实际”问题的方法,而不是陷入困境。同样,汇总将允许明显更快的查询。
瑞克·詹姆斯

2

因此,我一直在寻找与数据仓库相关的新型系统:Data Lake System。

您可以在Wikipedia上了解更多信息:

数据湖是一种在系统内存储数据的方法,该方法有助于以变体方案和结构形式(通常是对象Blob或文件)将数据并置。Hadoop和AWS S3平台可用于构建数据湖存储库。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.