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 关键字。每个快照可能有也可能没有相同的行。两个快照也可以有相同的帖子,但略有修改。
| 归档时间: |
|
| 查看次数: |
1612 次 |
| 最近记录: |