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

Fed*_*nzi 9 mysql database-design

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

  • 快照第 1 天:

    +----+---------------+------------+------------+        
    | ID |     Title     |  Category  |    Date    |
    +----+---------------+------------+------------+
    | 1  | My First Post | helloworld | 2015-01-01 |
    +----+---------------+------------+------------+
    
    Run Code Online (Sandbox Code Playgroud)
  • 快照第 2 天(今天添加了一个新帖子):

    +----+----------------+------------+------------+        
    | ID |      Title     |  Category  |    Date    |
    +----+----------------+------------+------------+
    | 1  | My first post  | helloworld | 2015-01-01 |
    | 2  | My second post | other      | 2015-01-02 |
    +----+----------------+------------+------------+
    
    Run Code Online (Sandbox Code Playgroud)
  • 快照第 3 天(今天删除了帖子 2):

    +----+---------------+------------+------------+        
    | ID |     Title     |  Category  |    Date    |
    +----+---------------+------------+------------+
    | 1  | My First Post | helloworld | 2015-01-01 |
    +----+---------------+------------+------------+
    
    Run Code Online (Sandbox Code Playgroud)

所以在几天之间,表格的一行可能是也可能不是恒定的。现在,我需要能够使用这样的查询:

SELECT category, COUNT(*) from day1.My_table group by category
Run Code Online (Sandbox Code Playgroud)

这是一天一桌。如果我们想计算一个月内按类别分类的每日平均帖子,我们应该这样做:

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
Run Code Online (Sandbox Code Playgroud)

另一个例子,一个月发布的帖子数量

SELECT COUNT(distinct id) 
from ( 
    SELECT id 
    from day1.My_table 
    UNION ALL ... 
    UNION ALL SELECT id 
              from day30.My_table
) 
Run Code Online (Sandbox Code Playgroud)

基本上我们需要考虑一个重量。如果我们有 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;
Run Code Online (Sandbox Code Playgroud)

正如评论也指出的,我需要做一个查询,如:

Select category, AVG(*) 
from [fromRange-toRange].MyTable; 
Run Code Online (Sandbox Code Playgroud)

对于一个极端的解决方案,我正在考虑实现元语言的想法,让未来的用户(例如营销人员)进行这样的查询。

你认为有没有办法在没有元语言的情况下在 Drill 中实现这一点?我会使用递归 UDF 来做到这一点,但它们无法返回查询。

每个快照都很大250GB,我希望能够将这些数据集与其他外部数据进行比较(我事先不知道这些数据集的方案)。

是否有适合 Apache Drill 的解决方案?或者这个问题有另一种解决方案吗?

此外,任何有关此问题的元语言或论文都值得赞赏。

编辑: 我们没有交易数据。我们有随时间变化的数据,可以添加或删除;出于这个原因,我们需要日常快照。此外,我们事先不知道将要执行的查询,因此我们无法知道要进行哪种类型的聚合。每行大约有 100 列,每个快照(Mysql 表)有 250GB。我们还需要对每一行、每一天的数据进行全文搜索。

搜索的一个例子可能是“有多少帖子是关于某个主题的?” 所以它必须在所有帖子中搜索 sometopic 关键字。每个快照可能有也可能没有相同的行。两个快照也可以有相同的帖子,但略有修改。

Fed*_*nzi 2

所以我一直在寻找一种与数据仓库相关的新型系统:数据湖系统。

您可以在维基百科上了解更多信息:

数据湖是一种在系统内存储数据的方法,有助于以不同模式和结构形式(通常是对象 blob 或文件)共置数据。Hadoop和AWS S3平台可用于构建数据湖存储库。